Android基础面试题

  • Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?

Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的Fragment 和 replace 的 Fragment。

先将上一个fragment压栈,再添加一个新的fragment。

transition.addToBackStack(null)

通过popBackStack可以将压入的栈再次显示出来。

supportFragmentManager.popBackStack()
  • App异常退出时,打印日志,重新启动怎么做?

在Application中注册UncaughtExceptionHandler,当发生崩溃会回调uncaughtException()方法,此时在其中做打印日志,重新启动等操作。

public class MyApplication extends Application {

    private static MyApplication application;
    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        // 程序崩溃时触发线程  以下用来捕获程序崩溃异常
        Thread.setDefaultUncaughtExceptionHandler(handler); 
    }
   private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            restartApp(); //发生崩溃异常时,重启应用
        }
    };
    private void restartApp() {
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent restartIntent = PendingIntent.getActivity(
                application.getApplicationContext(), 0, intent,Intent.FLAG_ACTIVITY_NEW_TASK);
        //退出程序
        AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
                restartIntent); // 1秒钟后重启应用

        //结束进程之前可以把你程序的注销或者退出代码放在这段代码之前
        android.os.Process.killProcess(android.os.Process.myPid());
    }

}
  • res/drawable、res/raw、/assets下的区别

res文件夹和assets文件夹区别:
1.res下创建文件,能将ID注册在R文件中,即能通过R.res.xx获取属性。assets需要用径路来使用文件。
2.res下,打包时自动只打包用的上的文件,没用上的文件不打包;assets文件夹里,无论是否在项目中用到,会被原封不动的打包到APK。
3.res/raw,res/assets下图片不会被压缩,res/drawable下会被压缩。

动画实现原理:

Android视图是以树形结构添加的,子view都有一个父view。当一个view调用动画,会对其比如大小,位置,透明度等发生改变。子view就会在每一帧动画改变后调用invalidate(),invalidate内部获取了parentView-它的父view调用ondraw()进行重绘,父view就会遍历将所有子view进行重绘,从而将子view的变化过程实时绘制出来。

低版本SDK实现高版本api

当程序使用一些方法或属性时,当判断项目minsdk还不支持该属性时,就会报错。那么就要加上
@TargetApi(Build.VERSION_CODES.X),声明让低版本sdk去调用高版本的api。

Android为每个应用程序分配的内存大小是多少?

Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,一旦应用超出这个内存使用值就会OOM。
不同的手机支持的App最大内存不一样。可以通过ActivityManager去获取。

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        int memClass = activityManager.getMemoryClass();

获取最大内存:

Runtime rt=Runtime.getRuntime();
long maxMemory=rt.maxMemory();

Android应用程序的默认最大内存值为16M

    static public int staticGetLargeMemoryClass() {
        // Really brain dead right now -- just take this from the configured
        // vm heap size, and assume it is in megabytes and thus ends with "m".
        String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
        return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
    }

Bundle机制

Bundle用于在Activity,fragment之间传值,Activity,fragment保存状态值的使用。

public final class Bundle extends BaseBundle implements Cloneable, Parcelable

Bundle用final修饰,不能被继承。由于要传值,所以需要序列化。
内部使用ArrayMap的键值对进行存储。

ArrayMap<String, Object> mMap = null; 
怎么跨进程启动app?

使用PackageManager,通过包名来启动应用,intent需要添加flag FLAG_ACTIVITY_NEW_TASK。

这里启动一个应用,包名为com.libo.wanandroid,启动activity的类路径为com.libo.module_home.activity.HomeActivity:

    /**
     * 跨进程启动应用
     */
    private void remoteLaunch() {
        ComponentName componentName = new ComponentName("com.libo.wanandroid", "com.libo.module_home.activity.HomeActivity");

        Intent launchIntent = new Intent();
        launchIntent.setComponent(componentName);
        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(launchIntent);
    }

参考:https://blog.csdn.net/binzeefox/article/details/106755762

如何将一个Activity设置成窗口的样式。

<activity>中配置:android :theme="@android:style/Theme.Dialog"

Android中还了解哪些方便线程切换的类?

例如:Runnable AsyncTask EventBus Rxjava 协程

make Project、clean Project、Rebuild Project的区别

Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。
Clean Project:删除之前编译后的编译文件,并重新编译整个Project,比较花费时间,不生成apk。
Rebuild Project:同Clean Project一样
Build APK:重新编译生成apk

子view比父view大时,怎么让子view能超出父view?

在父布局中,加上android:clipChildren="false"这个属性,不限制子view大小,默认为true。

  • 如何绕过9.0Http限制?

Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。需要在AndroidManifest.xml文件中的application标签中设置:

android:usesCleartextTraffic="true"

android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。

  • Kotlin中函数的可见性修饰符是怎样的
  • 直接在 Activity 中创建一个 thread 跟在 service 中创建一个 thread 之间的区别?

在 Activity 中被创建:该 Thread 的就是为这个 Activity 服务的,完成这个特定的
Activity 交代的任务,主动通知该 Activity 一些消息和事件,Activity 销毁后,该
Thread 也没有存活的意义了。
在 Service 中被创建:这是保证最长生命周期的 Thread 的唯一方式,只要整个
Service 不退出,Thread 就可以一直在后台执行,一般在 Service 的 onCreate()
中创建,在 onDestroy()中销毁。所以,在 Service 中创建的 Thread,适合长期
执行一些独立于 APP 的后台任务,比较常见的就是:在 Service 中保持与服务器
端的长连接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 0.Android手机操作系统的四层架构? Applications , Application Framewor...
    lucas777阅读 7,896评论 0 16
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 前几天整理了Java面试题集合,今天再来整理下Android相关的面试题集合.如果你希望能得到最新的消息,可以关注...
    Boyko阅读 3,697评论 8 135
  • 介绍自己负责的部分,如何实现的。 自定义view viewGroup activity的启动流程 事件传递及滑动冲...
    东经315度阅读 1,248评论 1 4
  • 别人的总结不一定适合自己,所以尽量多做一些自己的总结,针对自己的薄弱点重点说明,适当的借鉴别人,少走一些弯路。最重...
    renkuo阅读 7,490评论 2 48