android activity 回调函数,Android Activity的生命周期
Activity的生命周期
Android系統根據activity的所處不同階段對應的喚起其特定的回調函數來執行代碼。activity的一系列有序的生命周期回調函數。本文將來討論下activity各階段生命周期的回調函數,以及其調用場景。
basic-lifecycle.png
Created: 在activity 調用onCreate()方法后,activity處于已經創建完成的狀態。
Started: activity處于部分可見且未獲得焦點的狀態
Resumed: activity處于獲得焦點的狀態,activity處于最前端的, 用戶可以與它進行交互。
Paused: activity處于部分可見但失去焦點的狀態,activity被另一activity(半透明的,所以部分可見)所遮蓋。
Stoped: activity處于不可見的狀態
注: Created與Started都是短暫存在的,系統快速的執行onCreate()和onStart()并執行下一階段的回調函數移動到下一個狀態。系統調用onCreate(),之后會迅速調用onStart(), 之后再迅速執行onResume()。
Activity的生命周期回調函數
正常的生命周期回調
在了解了activity的生命周期簡要說明后,對于我們程序員來說,更重要的是在編碼過程中更好的配合activity在各個階段做恰當的事情。
onCreate: 用來執行程序啟動所需要的基本邏輯。為了創建一個activity所需要的一些基礎操作。 如,聲明UI(setContentView),定義成員變量(findViewById),配置UI(setText)等。
onRestart: 當activity從不可見,重新變為可見時調用,比如用戶突然點Home鍵回到主頁面,或者一個來電被接通并掛斷等。
onStart:
onResume: onStart() 與 onResume()執行時迅速的,在用戶從Paused 或者 Stopped狀態中恢復的時候操作,比如用戶離開且回來后,重新請求一次服務器數據。
onPause: 該回調意味著用戶有可能離開這個activity(且不回來),所以需要停止目前正在運行任務的操作, 比如暫停動畫播放或者是保存那些有可能需要自動保存的信息(比如緩存筆記草稿,雖然用戶沒點保存,但他期望任何時候離開都能保存草稿)。 如果用戶從暫停狀態回到你的activity, 系統應該恢復那些數據并執行onResume()方法。
onStart: activity即將停止,需要保存長久數據(比如筆記草稿同步到服務器),做一些資源回收操作。
onDestory: 正常情況下的activity局部變量引用會隨著activity的銷毀而銷毀(特殊的,存在Context內存泄漏),垃圾回收。 你的activity應該在onPause()與onStop()中執行清除activity資源的操作。但,如果你的activity包含了你在onCreate時創建的后臺線程,或者其他有可能導致內存泄漏的資源, 你應該在OnDestroy()關閉他們。
注:正常的情況下activity A跳轉到B 執行的生命周期回調是
A.onPause > B.onCreate > B.onStart > B.onResume > A.onStop
所以如果在A.onPause 或者 B的啟動回調中做了耗時操作,就會導致activity啟動的時候白屏或者透明(依主題而定),可以通過異步處理耗時操作解決,或者治標不治本的在Manifest引用Theme設置android:windowBackground(特別對于啟動頁)。
被Destroy的生命周期回調
默認情況下, 系統會使用Bundle實例來保存每一個視圖對象中的信息(例如輸入EditText 中的文本內容)。(activity通過調用其成員變量mDecor去逐層保存其子View(包括setContentView設置的布局)的狀態,比如;保存EditText 組件中的文本,mDecor是activity根View)
因此,如果你的Activity被destroyed與recreated,那么layout的狀態信息會自動恢復到之前的狀態。然而,你的activity也許存在更多你想要恢復的狀態信息,例如記錄成員變量值。
所以為了能使Android系統能夠恢復Activity中的View的狀態, 每個View都必須有一個全局唯一的ID。
為了讓你可以保存額外的數據到Bundle實例。Activity提供了onSaveInstanceState()和onRestoreInstanceState(),當你的Activity被系統殺死時。當系統調用這個函數時,系統會在你的Activity被異常Destory時傳遞一個Bundle 對象(也就是super.onCreate ( savedInstanceState);中攜帶的參數savedInstanceState )。然后如果系統在Activity被Destory之后想重新創建這個Activity實例時,之前的那個Bundle對象會被傳遞到你的activity的onRestoreInstanceState()方法與 onCreate() 方法中。
注: @override的onSaveInstanceState只會在activity被系統因為內存不足殺死的等情況下才會回調,而程序主動調用finish和用戶點擊back鍵盤是不會回調的。
onSaveInstanceState(): 在onStop() 方法之后執行,這個方法會默認保存Activity視圖的狀態信息, 例如在 EditText 組件中的文本或者是 ListView 的滑動位置。為了給Activity保存額外的狀態信息, 你必須實現onSaveInstanceState() 并增加key-value pairs到 Bundle 對象中。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// 保存用戶游戲狀態
savedInstanceState.putInt(SCORE, mCurrentScore);
savedInstanceState.putInt(LEVEL, mCurrentLevel);
// 默認實現會保存view樹的狀態信息
super.onSaveInstanceState(savedInstanceState);
}
onRestoreInstanceState(): 在 **onStart() 方法之后執行. **系統僅僅會在存在需要恢復的狀態信息時才會調用 onRestoreInstanceState() , 因此你不需要檢查 Bundle 是否為null。它必不為null。但如果你用到onCreate方法里的savedInstanceState 就需要判斷了。
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢復成員變量的狀態信息
mCurrentScore = savedInstanceState.getInt(SCORE);
mCurrentLevel = savedInstanceState.getInt(LEVEL);
}
總結
以上是生活随笔為你收集整理的android activity 回调函数,Android Activity的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 声音,同时播放声音And
- 下一篇: 和鸿蒙系统合作品牌,华为:明年将有超40