Activity生命周期与启动模式
生命周期
Activity的生命周期相信大家都烂熟于胸了,总结起来可以用一张图片概括
这其中又分为两种情况,正常启动和异常启动
正常启动
沿着上图中的中轴线的启动方式,是最经典的启动方式,就无需多言了
一个问题,onStart onResume, onPause onStop 看起来差不多,它们有什么区别呢
区别在于,前者都是从是否可见的角度来进行的生命周期调用,而后者都是从是否位于前台的角度来看的, 可以根据这个区别在不同的周期回掉里做不同的处理。
异常情况
主要的是activity在后台被杀死后的重启过程,如果没有特殊设置的话,在被杀死之前,会调用onSaveInstanceState来保存一些状态,比如文本框文字等
在启动过后,会调用onRestyoreInstanceState来恢复之前保存的状态信息。
当我们在manifest中设置了onconfigchange属性的时候,在结束之前,会调用onConfigrationChanged来进行状态保存,那么我们就可以通过对onConfigCHnage属性的配置来针对不同情况下做出不同的状态保存了。
Activity的启动模式
提到启动模式,无非就是经典的几种
stand 标准模式
singleTask 只会在任务栈里存在一个,如果已经有了,会将上部的任务全部出栈
singleTop 如果栈顶没有,就新建,如果有,就不新建
singleInstance 新开一个任务栈,将这个任务入栈
TaskAffinity属性
这是一个比较难理解的属性,大概可以认为是,亲和性,当一个任务被新建的时候,如果这个属性设置了另一个任务栈的包名,那么它会被盖到那个任务栈上去,成为其中的一部分。
具体可以看这一篇文章
关于TaskAffinity属性的作用
在代码中通过FLAG设置Activity的启动方式
不仅可以通过在manifest中配置launch_mode来设置启动模式,还可以在代码中通过FLAG来设置,当然,代码设置的优先级是比配置文件更低的。
常用的FLAG有这么几个
FLAG_ACTIVITY_NEW_TASK 对应singletask
FLAG_ACTIVITY_SINGLE_TOP 对应singleTop
FLAG_ACTIVITY_CLEAR_TOP 对应singletask
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 比较特殊,可以让activity在recent app界面(一般是按菜单键弹出的那个界面)不可见
关于ACTION和CATEGORY的匹配规则
简单的说,ACTION必须要有,而category可以没有因为系统会自动给没有的加上一个DEFAULT的category。