1. 生命周期
(1)正常的生命周期
onCreate()
onStart(),onRestart()
onResume()
onPause()
onStop()
onDestroy()
下圖為Android Developers官網(wǎng)的圖:

注:A 打開 B,則先執(zhí)行 A 的 onPause,再執(zhí)行 B 的 onResume。所以在 onPause 中不可以做耗時操作。
(2)異常情況下的生命周期
在 Activity 被異常銷毀時,onSaveInstanceState 和 onRestoreInstanceState 會被調(diào)用,下面記錄可能發(fā)生的異常情況:
系統(tǒng)配置發(fā)生變化導(dǎo)致 Activity 被殺死并重新創(chuàng)建
比如橫豎屏切換,View 的 onSaveInstanceState 會幫我們保存一部分?jǐn)?shù)據(jù),具體會保存哪些可以在每個 View 的 onSaveInstanceState 中查看。(EditText 會保存已經(jīng)輸入的文本,ListView 會保存目前查看的處于的位置)Activity 由于內(nèi)存不足被回收
Activity 分為:
前臺,正在交互;
可見(如彈出對話框的 Activity);
后臺,比如執(zhí)行了 onStop();
在內(nèi)存不足時根據(jù)優(yōu)先級來決定殺死目標(biāo) Activity 所在的進程。為了更好地保活,把后臺工作放在 Service 中可以保證進程有一定的優(yōu)先級。
以上分析了異常的情況,那么在配置發(fā)生改變的情況下,有沒有辦法讓 Activity 不重建呢?答案在 configChanges 配置中,
如:android:configChanges="orientation|screenSize"
上行配置指定后,則在屏幕旋轉(zhuǎn)時則不會重新創(chuàng)建 Activity,也不會調(diào)用 onSaveInstanceState 和 onRestoreInstanceState,只會調(diào)用onConfigrationChanged。
注:當(dāng) minSdkVersion 和 targetSdkVersion 大于13時,屏幕發(fā)生旋轉(zhuǎn)時為防止 Activity 重啟,還需加上 screenSize。
2. Activity 的四種啟動模式:
(1) standard
標(biāo)準(zhǔn)啟動模式。添加一個 Activity 在該棧的棧頂,如A啟動了B,B就會處于A所在的棧。
所以,如果用 Application 去啟動 Activity 的話,就會報錯 Calling startActivity from outside of an Avtivity context requires the FLAG_ACTIVITY_NEW_TASK,因為非 Activity 的 Context 并沒有棧。解決辦法:為待啟動 Activity 指定 FLAG_ACTIVITY_NEW_TASK,這樣啟動時就會給它創(chuàng)建一個新的棧,不過這樣做也就是 singleTask 方式啟動了。
(2) singleTop
棧頂復(fù)用模式,如果要啟動的 Activity 位于棧頂,啟動則不會創(chuàng)建新的 Activity,并且會調(diào)用 onNewIntent 方法,onCeate 和 onStart 方法不會被調(diào)用。
(3) singleTask
棧內(nèi)復(fù)用模式,如果要啟動一個 Activity,首先看是否存在它想要的棧,如果不存在,則創(chuàng)建一個棧并 push 該 Activity,如果存在,則看棧內(nèi)是否有該 Activity 的實例,如果沒有,則創(chuàng)建實例并 push,否則,找到這個 Activity,clearTop,并回調(diào) onNewIntent 方法。
(4) singleInstance
單實例模式,除了具有 singleTask 的特點,還獨自占據(jù)一個棧。
注:之前面試遇到一個問題,可不可以用 singleTask 實現(xiàn) singleInstance 的效果,這里想到是否是用 singleTask 方式啟動,但是為其指定一個單獨的棧。