android activity 回调函数,Android Activity的生命周期
Activity的生命周期
Android系統(tǒng)根據(jù)activity的所處不同階段對(duì)應(yīng)的喚起其特定的回調(diào)函數(shù)來執(zhí)行代碼。activity的一系列有序的生命周期回調(diào)函數(shù)。本文將來討論下activity各階段生命周期的回調(diào)函數(shù),以及其調(diào)用場(chǎng)景。
basic-lifecycle.png
Created: 在activity 調(diào)用onCreate()方法后,activity處于已經(jīng)創(chuàng)建完成的狀態(tài)。
Started: activity處于部分可見且未獲得焦點(diǎn)的狀態(tài)
Resumed: activity處于獲得焦點(diǎn)的狀態(tài),activity處于最前端的, 用戶可以與它進(jìn)行交互。
Paused: activity處于部分可見但失去焦點(diǎn)的狀態(tài),activity被另一activity(半透明的,所以部分可見)所遮蓋。
Stoped: activity處于不可見的狀態(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)要說明后,對(duì)于我們程序員來說,更重要的是在編碼過程中更好的配合activity在各個(gè)階段做恰當(dāng)?shù)氖虑椤?/p>
onCreate: 用來執(zhí)行程序啟動(dòng)所需要的基本邏輯。為了創(chuàng)建一個(gè)activity所需要的一些基礎(chǔ)操作。 如,聲明UI(setContentView),定義成員變量(findViewById),配置UI(setText)等。
onRestart: 當(dāng)activity從不可見,重新變?yōu)榭梢姇r(shí)調(diào)用,比如用戶突然點(diǎn)Home鍵回到主頁(yè)面,或者一個(gè)來電被接通并掛斷等。
onStart:
onResume: onStart() 與 onResume()執(zhí)行時(shí)迅速的,在用戶從Paused 或者 Stopped狀態(tài)中恢復(fù)的時(shí)候操作,比如用戶離開且回來后,重新請(qǐng)求一次服務(wù)器數(shù)據(jù)。
onPause: 該回調(diào)意味著用戶有可能離開這個(gè)activity(且不回來),所以需要停止目前正在運(yùn)行任務(wù)的操作, 比如暫停動(dòng)畫播放或者是保存那些有可能需要自動(dòng)保存的信息(比如緩存筆記草稿,雖然用戶沒點(diǎn)保存,但他期望任何時(shí)候離開都能保存草稿)。 如果用戶從暫停狀態(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í)候白屏或者透明(依主題而定),可以通過異步處理耗時(shí)操作解決,或者治標(biāo)不治本的在Manifest引用Theme設(shè)置android:windowBackground(特別對(duì)于啟動(dòng)頁(yè))。
被Destroy的生命周期回調(diào)
默認(rèn)情況下, 系統(tǒng)會(huì)使用Bundle實(shí)例來保存每一個(gè)視圖對(duì)象中的信息(例如輸入EditText 中的文本內(nèi)容)。(activity通過調(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樹的狀態(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);
}
總結(jié)
以上是生活随笔為你收集整理的android activity 回调函数,Android Activity的生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 声音,同时播放声音And
- 下一篇: android sina oauth2.