Activity的生命周期
Android系統(tǒng)根據(jù)activity的所處不同階段對(duì)應(yīng)的喚起其特定的回調(diào)函數(shù)來(lái)執(zhí)行代碼乏苦。activity的一系列有序的生命周期回調(diào)函數(shù)。本文將來(lái)討論下activity各階段生命周期的回調(diào)函數(shù)烁挟,以及其調(diào)用場(chǎng)景。
- Created: 在activity 調(diào)用onCreate()方法后赌渣,activity處于已經(jīng)創(chuàng)建完成的狀態(tài)猜扮。
- Started: activity處于部分可見(jiàn)且未獲得焦點(diǎn)的狀態(tài)
- Resumed: activity處于獲得焦點(diǎn)的狀態(tài)郎笆,activity處于最前端的谭梗, 用戶可以與它進(jìn)行交互。
- Paused: activity處于部分可見(jiàn)但失去焦點(diǎn)的狀態(tài)宛蚓,activity被另一activity(半透明的激捏,所以部分可見(jiàn))所遮蓋。
- Stoped: activity處于不可見(jiàn)的狀態(tài)
注: Created與Started都是短暫存在的凄吏,系統(tǒng)快速的執(zhí)行onCreate()和onStart()并執(zhí)行下一階段的回調(diào)函數(shù)移動(dòng)到下一個(gè)狀態(tài)远舅。系統(tǒng)調(diào)用onCreate()闰蛔,之后會(huì)迅速調(diào)用onStart(), 之后再迅速執(zhí)行onResume()。
Activity的生命周期回調(diào)函數(shù)
正常的生命周期回調(diào)
在了解了activity的生命周期簡(jiǎn)要說(shuō)明后图柏,對(duì)于我們程序員來(lái)說(shuō)序六,更重要的是在編碼過(guò)程中更好的配合activity在各個(gè)階段做恰當(dāng)的事情。
- onCreate: 用來(lái)執(zhí)行程序啟動(dòng)所需要的基本邏輯蚤吹。為了創(chuàng)建一個(gè)activity所需要的一些基礎(chǔ)操作例诀。 如,聲明UI(setContentView)裁着,定義成員變量(findViewById)余佃,配置UI(setText)等。
- onRestart: 當(dāng)activity從不可見(jiàn)跨算,重新變?yōu)榭梢?jiàn)時(shí)調(diào)用,比如用戶突然點(diǎn)Home鍵回到主頁(yè)面椭懊,或者一個(gè)來(lái)電被接通并掛斷等诸蚕。
- onStart:
- onResume: onStart() 與 onResume()執(zhí)行時(shí)迅速的,在用戶從Paused 或者 Stopped狀態(tài)中恢復(fù)的時(shí)候操作氧猬,比如用戶離開(kāi)且回來(lái)后背犯,重新請(qǐng)求一次服務(wù)器數(shù)據(jù)。
- onPause: 該回調(diào)意味著用戶有可能離開(kāi)這個(gè)activity(且不回來(lái))盅抚,所以需要停止目前正在運(yùn)行任務(wù)的操作漠魏, 比如暫停動(dòng)畫(huà)播放或者是保存那些有可能需要自動(dòng)保存的信息(比如緩存筆記草稿,雖然用戶沒(méi)點(diǎn)保存妄均,但他期望任何時(shí)候離開(kāi)都能保存草稿)柱锹。 如果用戶從暫停狀態(tài)回到你的activity, 系統(tǒng)應(yīng)該恢復(fù)那些數(shù)據(jù)并執(zhí)行onResume()方法丰包。
- onStart: activity即將停止禁熏,需要保存長(zhǎng)久數(shù)據(jù)(比如筆記草稿同步到服務(wù)器),做一些資源回收操作邑彪。
- onDestory: 正常情況下的activity局部變量引用會(huì)隨著activity的銷毀而銷毀(特殊的瞧毙,存在Context內(nèi)存泄漏),垃圾回收寄症。 你的activity應(yīng)該在onPause()與onStop()中執(zhí)行清除activity資源的操作宙彪。但,如果你的activity包含了你在onCreate時(shí)創(chuàng)建的后臺(tái)線程有巧,或者其他有可能導(dǎo)致內(nèi)存泄漏的資源释漆, 你應(yīng)該在OnDestroy()關(guān)閉他們。
注:正常的情況下activity A跳轉(zhuǎn)到B 執(zhí)行的生命周期回調(diào)是
A.onPause > B.onCreate > B.onStart > B.onResume > A.onStop
所以如果在A.onPause 或者 B的啟動(dòng)回調(diào)中做了耗時(shí)操作剪决,就會(huì)導(dǎo)致activity啟動(dòng)的時(shí)候白屏或者透明(依主題而定)灵汪,可以通過(guò)異步處理耗時(shí)操作解決檀训,或者治標(biāo)不治本的在Manifest引用Theme設(shè)置android:windowBackground(特別對(duì)于啟動(dòng)頁(yè))。
被Destroy的生命周期回調(diào)
默認(rèn)情況下, 系統(tǒng)會(huì)使用Bundle實(shí)例來(lái)保存每一個(gè)視圖對(duì)象中的信息(例如輸入EditText 中的文本內(nèi)容)享言。(activity通過(guò)調(diào)用其成員變量mDecor去逐層保存其子View(包括setContentView設(shè)置的布局)的狀態(tài)峻凫,比如;保存EditText 組件中的文本览露,mDecor是activity根View)
因此荧琼,如果你的Activity被destroyed與recreated,那么layout的狀態(tài)信息會(huì)自動(dòng)恢復(fù)到之前的狀態(tài)差牛。然而命锄,你的activity也許存在更多你想要恢復(fù)的狀態(tài)信息,例如記錄成員變量值偏化。
所以為了能使Android系統(tǒng)能夠恢復(fù)Activity中的View的狀態(tài)脐恩, 每個(gè)View都必須有一個(gè)全局唯一的ID。
為了讓你可以保存額外的數(shù)據(jù)到Bundle實(shí)例侦讨。Activity提供了onSaveInstanceState()和onRestoreInstanceState()驶冒,當(dāng)你的Activity被系統(tǒng)殺死時(shí)。當(dāng)系統(tǒng)調(diào)用這個(gè)函數(shù)時(shí)韵卤,系統(tǒng)會(huì)在你的Activity被異常Destory時(shí)傳遞一個(gè)Bundle 對(duì)象(也就是super.onCreate ( savedInstanceState);中攜帶的參數(shù)savedInstanceState )骗污。然后如果系統(tǒng)在Activity被Destory之后想重新創(chuàng)建這個(gè)Activity實(shí)例時(shí),之前的那個(gè)Bundle對(duì)象會(huì)被傳遞到你的activity的onRestoreInstanceState()方法與 onCreate() 方法中沈条。
注: @override的onSaveInstanceState只會(huì)在activity被系統(tǒng)因?yàn)閮?nèi)存不足殺死的等情況下才會(huì)回調(diào)需忿,而程序主動(dòng)調(diào)用finish和用戶點(diǎn)擊back鍵盤是不會(huì)回調(diào)的。
- onSaveInstanceState(): 在onStop() 方法之后執(zhí)行蜡歹,這個(gè)方法會(huì)默認(rèn)保存Activity視圖的狀態(tài)信息屋厘, 例如在 EditText 組件中的文本或者是 ListView 的滑動(dòng)位置。為了給Activity保存額外的狀態(tài)信息月而, 你必須實(shí)現(xiàn)onSaveInstanceState() 并增加key-value pairs到 Bundle 對(duì)象中擅这。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// 保存用戶游戲狀態(tài)
savedInstanceState.putInt(SCORE, mCurrentScore);
savedInstanceState.putInt(LEVEL, mCurrentLevel);
// 默認(rèn)實(shí)現(xiàn)會(huì)保存view樹(shù)的狀態(tài)信息
super.onSaveInstanceState(savedInstanceState);
}
- onRestoreInstanceState(): 在 **onStart() 方法之后執(zhí)行. **系統(tǒng)僅僅會(huì)在存在需要恢復(fù)的狀態(tài)信息時(shí)才會(huì)調(diào)用 onRestoreInstanceState() , 因此你不需要檢查 Bundle 是否為null景鼠。它必不為null仲翎。但如果你用到onCreate方法里的savedInstanceState 就需要判斷了。
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢復(fù)成員變量的狀態(tài)信息
mCurrentScore = savedInstanceState.getInt(SCORE);
mCurrentLevel = savedInstanceState.getInt(LEVEL);
}