Android组件中,Activity的生命周期是最复杂的。首先看一下完整的Activity生命周期图。
这张图粗略地表示了一个Activity从启动到销毁完整的生命周期。但是这篇文章想要探究Activity生命周期的更多细节。接下来的内容要看看Activity在一些特殊的场景下会有怎样的表现,生命周期中各个回调的执行顺序。这些会通过一个Demo的Log来展现。Demo的源码可以在这里找到。
场景1
首先是Activity正常启动然后销毁的流程。
1 | // 启动MainActivity后按下HOME键 |
场景2
启动Activity后翻转屏幕,未做任何处理的情况下。
1 | 2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate |
场景3
启动Activity后启动另一个Activity,然后返回并销毁。
1 | 2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate |
场景4
singletask模式或singleinstance模式的Activity重新启动和singletop模式在task顶部重新启动。
1 | 2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onCreate |
场景5
singletask模式或singleinstance模式的Activity启动新的Activity,新的Activity再启动老的Activity。
1 | 2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onCreate |
总结
经过这个实验搞清楚了一些比较容易忽略的细节
onSaveInstanceState
在onPause
和onStop
之间执行,onRestoreInstanceState
在onStart
和onResume
之间执行。- Activity A在启动Activity B时,流程是
A.onPause
->B.onCreate
->B.onStart
->B.onResume
->A.onStop
。返回时A.onRestart
在B.onPause
和A.onStart
之间执行。 - 在一些具有特殊启动模式的Activity重新启动自己时。流程是
onPause
->onNewIntent
->onResume
。 - 其他Activity A重新启动具有特殊启动模式的Activity B时。流程是
A.onPause
->B.onNewIntent
->B.onRestart
->B.onStart
->B.onResume
->A.onStop
。 - 还有两个比较不常见的方法
onPostCreate
和onPostResume
分别在onCreate
和onResume
执行完毕后回调,是成对出现的。流程是onCreate
->onStart
->onPostCreate
->onResume
->onPostResume
。
关于启动模式的一个细节
singletask
模式启动不一定会新开一个task。重新启动时只会清理在其上方的Activity,它更像是用FLAG_ACTIVITY_CLEAR_TOP
启动的效果。
在指定taskaffinity
后,会兼具FLAG_ACTIVITY_NEW_TASK
的功能。
一个launchMode
为standard
类型的Activity在使用FLAG_ACTIVITY_CLEAR_TOP
启动时,会销毁自己及自己上方的Activity再创建自己,如果想要保持不销毁并调用onNewIntent方法,需要与FLAG_ACTIVITY_SINGLE_TOP
一起使用,效果与指定launchMode
为singleTask
相同。