1 Activity的生命周期全面分析
onPause必须先执行完,新Activity的onResume才会执行,所以onPause不能执行耗时操作。
如果新Activity采用了透明主题,那么当前Activity不会回调onStop;
onSaveInstanceState只会在Activity被异常终止的情况下才会调用,时间是在onStop之前,可能在onPause之前,也可能之后。
onRestoreInstanceState在onStart之后,
指定configChanges可以阻止系统匹配改变导致Activity重建;常用的locale,oretion,keybordhidden,screenSize(API>13);
2 Activity的LaunchMode
standard:标准模式,谁启动就在谁的栈中,Application,Context无法启动该模式,因为没有所谓的任务栈,解决方式为FLAG_ACTIVITY_NEW_TASK标志位。
singleTop:栈顶复用模式,如果位于栈顶,就不创建新实例,onNewIntemt被调用。
应用场景:推送消息,如果当前位于消息详情界面,从通知点击进入,只会创建一个实例。
登录场景,点击按钮登录,可能网络延迟,重复点击,就会显示两个登录界面。
singleTask: 栈内复用模式,此任务栈中只有一个实例,如果Activity A不在栈顶,且存在A的实例,会销毁A上面所有的
Activity,暴露出Activity A。
应用场景:
作用:程序的入口
做浏览器,微博之类的应用:
比如其他App需要打开我们的浏览器页面,
就可以设置 浏览器页面启动模式为singleTask模式,保证它只有一个实例,
节约内存同时按下返回键后的感官也更顺畅。
但是需要注意:
提供给人调用的页面最好是栈底元素,因为如果自己的客户端正在运行状态,按下home键后台挂起,此时如果其他应用(QQ)调自己的客户端的主页面,那么按下回退键
,页面都会停留在自己的客户端,(因为自己的Activity不为空),这明显不符合逻辑的。。。
singleInstance:单实例模式,只有一个实例,并且这个实例独立运行在activity任务栈中,这个task中只有这个实例,不允许有别的activity存在。
应用场景:拨打电话界面,我们app要调用拨打电话,发现系统应用已启动并单独存在,此时app就不需要重新创建,而是直接复用电话界面。
3 横竖屏切换生命周期
1 不设置Activity的android:configChanges时,切横屏会调用一次,切竖屏会执行两次。
2 设置Activity的android:configChanges="oriention"时,切屏还是会调用,切横竖只会执行一次。
3 设置Activity的android:configChanges="oriention"|keybordHidden,切屏不会调用各个生命周期,只会执行onConfiguartionChanges方法。
但是自从安卓3.2也就是api 13开始。还是会调用生命周期,这是因为screenSize也跟着屏幕的横竖切换而改变,所以在清单文件下,
MiniSdkVersion和TargetVersion属性大于13的情况下,如果你还想阻止程序在运行是重新加载Activity,还必须加一个属性ScreenSize。
4 安卓弹出dialog时activity的生命周期处于什么状态?
如果是当前activity弹出dialog,则不会执行activity任何方法,只有其他activity弹出了dialog或者挡住了当前的activity才会执行onPause方法。
5 Activity之间跳转的生命周期
A 到B onPause onCreate onStart onResume onStop
在B界面点击back键回到A onPause onRestart onResume onStop onDestory
在A界面按Home键回到桌面 onPause onStop
再次点击进入A界面 onRestart onStart onResume 。
6 简述Activity启动流程。
Activity启动源码相当复杂,涉及Instrumention,ActivityThread和ActivityManagerService(简称AMS).简单理解,启动Activity的请求会由
Instrumention来处理,然后它通过Binder向AMS发出请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,
AMS通过ActivityThread去同步Activity的状态从而完成生命周期的方法的调用。