一、activity生命周期介绍
相信大家都对android activity的生命周期有一定的了解了,其实一图足以说明:
如图:onStart.onStop方法对应后台是否可见,onResume.onPause对应是否位于前台,正常流程只有onResume后,activity才是可见可交互的,在此有个有趣的问题就是当activity A启动activity B时,那么他们的流程是怎么样的,其实应该是先调用A的onPause方法,然后调用B的onCreate、onStart、onResume,最后再调用A的onStop方法,不信大家可以写个例子自己验证下打个日志就清楚了。
二、在异常情况下生命周期的分析
1.activity被异常杀死后重新启动的情况
此种情况大部分是横竖屏切换的情况,在此情况下,activity会被销毁然后重新创建,这种情况下首先会回调onSaveInstanceState方法,此方法回调时在onStop方法之前回调,把系统的状态和数据进行保存,我们也可以在这个方法做些处理,安卓里面默认的view是已经实现了此方法。onSavaInstanceState方法保存数据的一些流程是先activity数据托管给当前window,window再托管给当前根布局DecorView,然后在一层一层分发给下面的view进行保存数据,实行分发机制。
保存数据后我们一般会通过onRestoreInstanceState方法恢复里面的数据,此方法回调时期是在onStart方法之后,我们也可以在此方法做判断进行数据恢复操作,其实在onCreate方法中也可以恢复数据,但是onCreate的如果是正常启动则数据没有,所以需要做个非空判断,但一般建议在onRestoreInstanceState方法中去恢复数据。
2.当系统内存不足回收activity的情况
前台activity:优先级最高
可见但非前台activity:如activity弹出一个窗口,此时窗口背后的activity可见但是不可交互,优先级低
后台activity:优先级最低,最容易被kill掉
其中一样回调onSaveInstanceState和onRestoreInstanceState方法,跟上面描述的一样
三、activity的启动模式
1.standard:最基本的模式,启动始终重新启动一个activity,默认是这种模式
2.singleTop:栈顶模式,当启动的activity正好位于栈顶时,则不重新启动activity,只是回调其中的onNewIntent方法,如ABC启动c时,此时任务栈内一样ABC
3.singleTask:此模式比较特殊,如果指定新的任务栈,那么会重新启动一个任务栈并把activity压入栈内,如果存在此任务栈并存在此activity,那么根据栈内复用特性,会直接把栈内的activity掉至栈顶,其上面的界面也会被clear掉,如ABCD启动A,则栈内只有A,其他的被清出任务栈
4.singInstance:单实例模式,这中是singleTask的加强版,就是新建一个任务栈,然后把activity压入栈入。
设置任务的属性为taskAffinity="xxxx.xx.xx"即可
在此要说说设置启动activity的形式,可以在Androidmanifest.xml里面设置,也可以代码设置如setFlag(FLAG_ACTIVITY_NEW_TASK),代码设置的优先级要更高,如果同时设置以代码设置为准。在此说下四种常用的标志的作用:
1.FLAG_ACTIVITY_NEW_TASK:此类似设置了singTask启动模式
2.FLAG_ACTIVITY_SINGLE_TOP:此类似设置了singleTop启动模式
3.FLAG_ACTIVITY_CLEAR_TOP:此一般配合FLAG_ACTIVITY_NEW_TASK配合使用,这个时候如果已经存在,那么只会回调该activity的onNewIntent方法;如果新启动的activity是standard模式,那么会清除它自己以及它自己之上的所有界面后重新建一个activity。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:设置后此activity不会出现在activity列表栏中