Android activity 生命週期總結

Activity生命週期的七個方法

void onCreate(Bundle savedInstanceState)  // Activity創建時
void onStart()   // activity對用戶可見時
void onRestart()  // activity從onStop狀態喚醒時
void onResume()  // activity獲取焦點時
void onPause()  // activity失去焦點時
void onStop()  // activity不可見時
void onDestroy() // activity銷燬前

生命週期圖解

這裏寫圖片描述

①、啓動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。
②、當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
③、當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
④、當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。
⑤、用戶後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
⑥、當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
⑦、用戶退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。

正確使用生命週期的好處

根據Activity的複雜程度,您可能不需要實現所有生命週期方法。但是,瞭解每個方法並實現確保您的應用按照用戶期望的方式運行的方法非常重要。正確實現您的Activity生命週期方法可確保您的應用按照以下幾種方式良好運行,包括:

如果用戶在使用您的應用時接聽來電或切換到另一個應用,它不會崩潰。
在用戶未主動使用它時不會消耗寶貴的系統資源。
如果用戶離開您的應用並稍後返回,不會丟失用戶的進度。
當屏幕在橫向和縱向之間旋轉時,不會崩潰或丟失用戶的進度。

狀態及存活時間

Resumed:在這種狀態下,Activity處於前臺,且用戶可以與其交互。(有時也稱爲“運行”狀態。)
Paused:在這種狀態下,Activity被在前臺中處於半透明狀態或者未覆蓋整個屏幕的另一個Activity—部分阻擋。暫停的Activity不會接收用戶輸入並且無法執行任何代碼。
Stopped:在這種狀態下,Activity被完全隱藏並且對用戶不可見;它被視爲處於後臺。停止時,Activity實例及其諸如成員變量等所有狀態信息將保留,但它無法執行任何代碼。

其它狀態 (Created與Started)都是短暫的瞬態,系統會通過調用下一個生命週期回調方法從這些狀態快速移到下一個狀態。 也就是說,在系統調用 onCreate()) 之後,它會快速調用 onStart()),緊接着快速調用 onResume())。

onCreate

我們必須實現onCreate()方法來執行程序啓動所需要的基本邏輯。例如可以在onCreate()方法中定義UI以及實例化類成員變量。(onCreate裏面儘量少做事情,避免程序啓動太久都看不到界面)

onDestroy

如果activity含有在onCreate調用時創建的後臺線程,或者是其他有可能導致內存泄漏的資源,則應該在OnDestroy()時進行資源清理,殺死後臺線程。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

onPause

如果activity實際上是要被Stop,那麼我們應該爲了切換的順暢而減少在OnPause()方法裏面的工作量(應該把那些heavy-load的工作放到onStop()去做)。

通常應該在onPause()回調方法裏面做以下事情:
停止動畫或者是其他正在運行的操作,那些都會導致CPU的浪費.
提交在用戶離開時期待保存的內容(例如郵件草稿).
釋放系統資源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何會影響到電量的資源。

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

onResume

請注意,系統每次調用這個方法時,activity都處於前臺,包括第一次創建的時候。所以,應該實現onResume()來初始化那些在onPause方法裏面釋放掉的組件,並執行那些activity每次進入Resumed state都需要的初始化動作 (例如開始動畫與初始化那些只有在獲取用戶焦點時才需要的組件)

onStop

極端情況下,系統會直接殺死我們的app進程,並不執行activity的onDestroy()回調方法, 因此我們需要使用onStop()來釋放資源,從而避免內存泄漏。
activity已經停止後,Activity對象會保存在內存中,並在activity resume時被重新調用。我們不需要在恢復到Resumed state狀態前重新初始化那些被保存在內存中的組件。系統同樣保存了每一個在佈局中的視圖的當前狀態,如果用戶在EditText組件中輸入了text,它會被保存,因此不需要保存與恢復它。

onRestart

onRestart()方法則是隻在activity從stopped狀態恢復時纔會被調用,因此我們可以使用它來執行一些特殊的恢復(restoration)工作,請注意之前是被stopped而不是destrory。

onStart

因爲系統會在創建activity與從停止狀態重啓activity時都會調用onStart()。也就是說,我們在onStop裏面做了哪些清除的操作,就該在onStart裏面重新把那些清除掉的資源重新創建出來。

重新創建Activity

有幾個場景中,Activity是由於正常的程序行爲而被Destory的。例如當用戶點擊返回按鈕或者是Activity通過調用finish()來發出停止信號。系統也有可能會在Activity處於stop狀態且長時間不被使用,或者是在前臺activity需要更多系統資源的時關閉後臺進程,以圖獲取更多的內存。

當Activity是因爲用戶點擊Back按鈕或者是activity通過調用finish()結束自己時,系統就丟失了對Activity實例的引用,因爲這一行爲意味着不再需要這個activity了。然而,如果因爲系統資源緊張而導致Activity的Destory, 系統會在用戶回到這個Activity時有這個Activity存在過的記錄,系統會使用那些保存的記錄數據(描述了當Activity被Destory時的狀態)來重新創建一個新的Activity實例。那些被系統用來恢復之前狀態而保存的數據被叫做 “instance state” ,它是一些存放在Bundle對象中的key-value pairs。(請注意這裏的描述,這對理解onSaveInstanceState執行的時刻很重要)

你的Activity會在每次旋轉屏幕時被destroyed與recreated。當屏幕改變方向時,系統會Destory與Recreate前臺的activity,因爲屏幕配置被改變,你的Activity可能需要加載另一些替代的資源(例如layout).

默認情況下, 系統使用 Bundle 實例來保存每一個View(視圖)對象中的信息(例如輸入EditText 中的文本內容)。因此,如果Activity被destroyed與recreated, 則layout的狀態信息會自動恢復到之前的狀態。然而,activity也許存在更多你想要恢復的狀態信息,例如記錄用戶Progress的成員變量(member variables)。

爲了使Android系統能夠恢復Activity中的View的狀態,每個View都必須有一個唯一ID,由android:id定義。

保存Activity狀態

當我們的activity開始Stop,系統會調用 onSaveInstanceState() ,Activity可以用鍵值對的集合來保存狀態信息。這個方法會默認保存Activity視圖的狀態信息,如在 EditText 組件中的文本或 ListView 的滑動位置。
必須要調用 onSaveInstanceState() 方法的父類實現,這樣默認的父類實現才能保存視圖狀態的信息。

恢復Activity狀態

由於 onCreate() 方法會在第一次創建新的Activity實例與重新創建之前被Destory的實例時都被調用,我們必須在嘗試讀取 Bundle 對象前檢測它是否爲null。如果它爲null,系統則是創建一個新的Activity實例,而不是恢復之前被Destory的Activity。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章