高级安卓开发面试题详解
网上遍布各种各样的面试题,亦或只有题目,亦或答案不齐全,尽个人所能将尽可能整理。
1. 如何理解volatile?
被volatile修饰的变量,JVM会把该线程对应的本地内存中的共享变量刷新到主内存中。被修饰变量对所有线程可见、有序、原子
参考:
Android并发编程之图文解析volatile关键字
2.什么是ANR 如何避免它?
- Application Not Responding。程序响应由AM和WM来监控,出现以下情况会提示ANR:
- 5秒内没有响应输入内容
- 广播10秒内没有执行完毕
- Service在20秒内没有处理完毕
- ANR发生的时候会在logcat打印错误信息,可获取到ANR类型、CPU使用情况、IOWait
。除了log输出外,你会发现各个应用进程和系统进程的函数堆栈信息都输出到了一个/data/anr/traces.txt的文件 - 避免主线程上执行复杂耗时操作,比如收发网络数据、大量计算、操作数据库、读写文件等;广播和service要注意处理时常,如果有耗时操作放到线程中。
3.Activity的启动模式
1. standard标准模式:
每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。这种模式,一个栈中可以有多个实例,每个实例也都有自己的任务栈。而且是谁启动了此Activity,那么这个Activity就运行在启动它的Activity所在的栈中。
2. singleTop栈顶复用模式:
如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行,我们可以通过Intent进行传值,而且它的onCreate(),onStart()方法不会被调用,因为它并没有发生任何变化。
归纳为以下三点:
当前栈中已有该Activity的实例并且该实例位于栈顶时,不会创建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewInten()方法;
当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例;
当前栈中不存在该Activity的实例时,其行为同standard启动模式。
3. singleTask站内复用模式:
如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。
4. singleTask站内复用模式:
如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。