弹出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的任务栈中。