Activity

生命周期

image

其實這張圖已經說明了activity的生命周期,但是在這里需要的注意的是,
(1)onCreat是activity正在被創建,也就是說此時的UI操作不會更新UI,比如setText操作,所以此時在子線程調用setText不會報線程錯誤。詳解可見Android子線程更新View的探索,在這個方法內我們可以做一些初始化工作。

(2)onRestart需要注意的是:activity正在重新啟動,一般情況下,activity從不可見狀態到可見狀態,onRestart才會被調用,但是一定要注意的是一般來說這是用戶行為導致activity不可見的時候,此時變為可見的時候才會調用onRestart,這里所說的用戶行為就是用戶按home鍵,或者進入“新”的activity。這樣的操作會使activity先執行onPause,后執行onStop,這樣回到這個activity會調用onRestart。為什么我這里強調說用戶行為導致的不可見狀態,等下我會說。。。。

(3)onStart的時候,activity才可見,但是沒有出現在前臺,無法與用戶交互

(4)onResume的時候,activity已經可見,并且出現在前臺開始活動,與onStart相比,activity都已經可見,但是onStart的時候activity還在后臺,onResume才顯示在前臺

(5)onPause主要注意的是:此時的activity正在被停止,接下來馬上調用onStop。特殊情況下快速回到該activity,onStop不會執行,會去執行onResume。
一般在這個生命周期內做存儲數據、停止動畫工作,但不能太耗時。
為什么特殊強調呢,因為該activity的onPause執行完了,才回去執行新的activity的onResume,一旦耗時,必然會拖慢新的activity的顯示。

(6)onStop:此時的activity即將停止。在這里可以做稍微重量級的操作,同樣也不能耗時。

(7)onDestroy:此時的activity即將被回收,在這里會做一些回收工作和最終資源釋放。

image
image

在這里我會特別提出一個point,就是異常情況下activity被殺死,而后被重新創建的情況。


image

這張圖非常重要,可以幫我們解決異常情況下activity如何正常回復的問題
當系統停止activity時,它會調用onSaveInstanceState()(過程1),如果activity被銷毀了,但是需要創建同樣的實例,系統會把過程1中的狀態數據傳給onCreate()和onRestoreInstanceState(),所以我們要在onSaveInstanceState()內做保存參數的動作,在onRestoreInstanceState()做獲取參數的動作。

Save Activity State

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

獲取參數操作:

onCreate() 方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

也可以

onRestoreInstanceState()方法

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容