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。

u3coding
A software developer

Leave a Comment

Your email address will not be published. Required fields are marked *

*