Activity的生命週期詳解(二)

二、暫停與恢復

在正常使用app時,前端的一、啓動與銷燬activity有時會被其他可見的組件阻塞(obstucted),從而導致目前的一、啓動與銷燬activity進入Pause狀態。例如,當打開一個半透明的一、啓動與銷燬activity時(例如以對話框的形式),之前的activity會被暫停。只要之前的activity仍然部分可見,這個activity就會一直處於Paused狀態。

然而,一旦之前的activity被完全阻塞並不可見時,則其會進入Stop狀態。下一節討論

activity一旦進入paused狀態,系統就會調用activity的onPause()方法,該方法可以停止不應該在暫停過程中執行的操作,如暫停視頻播放,或保存那些有可能需要長期保存的信息。如果用戶從暫停狀態回到當前activity,系統應該恢復那些數據並執行onResume()方法。

Note:當我們的activity收到調用onPause()信號時,那可能意味着activity將被暫停一段時間,並且用戶很可能回到我們的activity。然而,那也是用戶離開我們的activity的第一個信號。
這裏寫圖片描述
Figure1. 當一個半透明的activity阻塞activity時,系統會調用onPause()方法並且這個activity會停留在Paused狀態(1)
如果用戶在這個activity還是在Paused狀態時回到這個activity,系統則會調用它的onResume()(2)

2.暫停Activity

當系統調用activity中的onPause(),從技術上講,意味着activity仍然處於部分可見的狀態。但更多時候意味着用戶正在離開這個activity,並馬上回進入Stopped state,通常應該在onPaused()回調方法裏面做以下事情:
*停止動畫或其他正在運行的操作,那些都會導致CPU的浪費
*提交在用戶離開使其待保存的內容(例如郵件草稿)
*釋放系統資源,例如broadcast receivers, sensors(比如GPS),或其他任何會影響到電量的資源。

例如,如果程序使用Camera, onPause()會是一個比較好的地方去做那些釋放資源的操作。

@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;
    }
}

通常,不應該使用onPause()來保存用戶改變的數據(例如填入表格中的個人信息)到永久存儲(File或DB)。僅僅當確認用戶期待那些改變能夠被自動保存的時候(例如正在撰寫郵件草稿),才把那些數據存到永久存儲。但是,我們應該避免在onPause(0時執行CPU-intensive的工作,例如寫數據到DB,因爲它會導致切換到下一個activity變得緩慢(應該把那些heavy-load的工作放到onStop()中去做)

如果activity實際上要被Stop,那麼我們應該爲了切換的順暢而減少在OnPause()方法裏面的工作量。

Note:當activity處於暫停狀態,Activity實例是駐留在內存中的,並且在activity 恢復的時候重新調用。我們不需要在恢復到Resumed狀態的一系列回調方法中重新初始化組件。

3.恢復activity

當用戶從Paused狀態恢復activity時,系統會調用onResume()方法。

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

下面的onResume()的例子與上面的onPause()例子相對應的

@Override
public void onResume(){
    super.onResume();  // Always call the superclass method first
    // Get the Camera instance as the activity achieves full user focus
      if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

進入Paused,不一定要Stopped; 進入Stopped, 不一定要Destory.
而且,Destory Activity 並不代表不需要保存運行時的狀態數據。比如,需要有一個flag,用來判斷用戶是不是第一次進入這個Activity,從而顯示Help信息,這時候在退出時就需要保存這個flag。例子可能不是很恰當的,只是說明需要保存數據。

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