Activity的生命周期和启动模式

正常情况下生命周期:onCreate()-->onStart()-->onResume()-->onPause()-->onStop-->onDestroy

弹出Dialog恢复时:onPause()-->onResume()....

进入后台恢复时:onStop()-->onRestart()-->onStart()....

异常情况下:onSaveInstanceState()-->onDestory()    重新创建:onCreate()-->onRestoreInstanceState()

异常情况下恢复数据:onRestoreInstanceState和onCreate 都可以恢复,区别在于onCreate中需要判断Bundle是否为

空,因为正常情况下onCreate方法的参数Bundle是为null的,onRestoreInstanceState中恢复数据不用判空。

如果不想让Activity重新创建的话可以配置configChanges属性,

例如:Android:configChanges="orientation"(横竖屏切换时不会重新创建)


Activity启动模式:使用launchMode属性设置或者Intent.setFlag();

1):standard  标准模式:每次都是新的实例,不管这个实例是否已经存在。

注意:当使用Context类型(如:ApplicationContext)去启动standard模式的Activity会报错,因为standard

模式的Activity默认会进入启动它的Activity所属的任务栈中,而非Activity类型是没有所谓的任务栈的。。

解决这个问题的方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位。

2):singleTop  栈顶复用模式:这种情况下如果新的Activity位于栈顶,那么次Activity不会被重新创建,同时它的

onNewIntent方法会被调用。如果新的Activity不是位于栈顶,则会重新创建新的Activity。


3):singleTask  栈内复用模式:只要Activity存在于栈内,那么多次启动Activity都不会创建新的Activity实例。

例如:目前有任务栈S1中情况为ABC,这个时候ActivityD以singleTask模式请求启动。

(1):D所需的任务栈为S2,由于实例D和任务栈S2都不存在,因此首先会创建任务栈S2,在创建D的实例并压入S2。

(2):假设D所需的任务栈为S1,由于S1已经存在,则会直接创建D的实例并压入S1任务栈,此时S1的情况为ABCD。

(3):如果D所需的任务栈为S1并且S1的情况为ADBC,根据栈内复用原则D不会重新创建实例,系统会把D切换到栈顶

调用onNewIntent方法同时由于singleTask默认会有clearTop的效果,会导致所有D上面的实例都会被出栈,最终S1

的情况为AD。


4):singleInstance  单例模式:该模式除了具有singleTask所有的特性外还增加了一点,具有该模式的Activity只能单

独的位于独立的任务栈中。


指定Activity任务栈的名称:TaskAffinity属性,默认情况下Activity所需的任务栈的名字为应用的包名,TaskAffinity属

性可以指定Activity所需任务栈的名称。

该属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。


(1):当TaskAffinity和singleTask配对使用时该任务栈的名字即为TaskAffinity属性指定的名称


(2) :当TaskAffinity和allowTaskReparenting属性配对使用时,会产生特殊的效果。

例如:当一个应用A启动了另一个应用B的某个Activity后,如果这个Activity的allowReparenting的值为TRUE,那么当

应用B启动后此Activity会直接从应用A的任务栈中转移到应用B的任务栈中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值