Activity各种情形的生命周期

Android组件中,Activity的生命周期是最复杂的。首先看一下完整的Activity生命周期图。

这张图粗略地表示了一个Activity从启动到销毁完整的生命周期。但是这篇文章想要探究Activity生命周期的更多细节。接下来的内容要看看Activity在一些特殊的场景下会有怎样的表现,生命周期中各个回调的执行顺序。这些会通过一个Demo的Log来展现。Demo的源码可以在这里找到。

场景1

首先是Activity正常启动然后销毁的流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 启动MainActivity后按下HOME键
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onSaveInstanceState
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
// 接下来再次启动MainActivity
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onRestart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
// 然后按Back键销毁
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onDestroy

场景2

启动Activity后翻转屏幕,未做任何处理的情况下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
// 此时翻转屏幕
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onSaveInstanceState
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onDestroy
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onRestoreInstanceState
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
// 此时销毁Activity
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onDestroy

场景3

启动Activity后启动另一个Activity,然后返回并销毁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
// 此时启动新Activity
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onSaveInstanceState
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
// 此时销毁新Activity
534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onRestart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onDestroy
// 此时销毁Activity
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/MainActivity[DEBUG]: onDestroy

场景4

singletask模式或singleinstance模式的Activity重新启动和singletop模式在task顶部重新启动。

1
2
3
4
5
6
7
8
9
10
11
12
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onResume
// 此时重新启动自己
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onNewIntent
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onResume
// 销毁
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/SingleTaskActivity[DEBUG]: onDestroy

场景5

singletask模式或singleinstance模式的Activity启动新的Activity,新的Activity再启动老的Activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onResume
// 此时启动standard模式的Activity
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onCreate
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onSaveInstanceState
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onStop
// 此时StandardActivity再启动SingleInstanceActivity
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onNewIntent
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onRestart
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onSaveInstanceState
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStop
// 销毁SingleInstanceActivity
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onRestart
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStart
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onResume
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/SingleInstanceActivity[DEBUG]: onDestroy
// 销毁StandardActivity
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onBackPressed
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onPause
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onStop
2534-2534/com.cm.ts.activity D/StandardActivity[DEBUG]: onDestroy

总结

经过这个实验搞清楚了一些比较容易忽略的细节

  1. onSaveInstanceStateonPauseonStop之间执行,onRestoreInstanceStateonStartonResume之间执行。
  2. Activity A在启动Activity B时,流程是A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop。返回时A.onRestartB.onPauseA.onStart之间执行。
  3. 在一些具有特殊启动模式的Activity重新启动自己时。流程是onPause->onNewIntent->onResume
  4. 其他Activity A重新启动具有特殊启动模式的Activity B时。流程是A.onPause->B.onNewIntent->B.onRestart->B.onStart->B.onResume->A.onStop
  5. 还有两个比较不常见的方法onPostCreateonPostResume分别在onCreateonResume执行完毕后回调,是成对出现的。流程是onCreate->onStart->onPostCreate->onResume->onPostResume

关于启动模式的一个细节

singletask模式启动不一定会新开一个task。重新启动时只会清理在其上方的Activity,它更像是用FLAG_ACTIVITY_CLEAR_TOP启动的效果。
在指定taskaffinity后,会兼具FLAG_ACTIVITY_NEW_TASK的功能。
一个launchModestandard类型的Activity在使用FLAG_ACTIVITY_CLEAR_TOP启动时,会销毁自己及自己上方的Activity再创建自己,如果想要保持不销毁并调用onNewIntent方法,需要与FLAG_ACTIVITY_SINGLE_TOP一起使用,效果与指定launchModesingleTask相同。