Android學習路線(十三)Activity生命週期——暫停和恢復(Pausing and Resuming )一個Activity...

weixin_33816946發表於2017-06-22

在正常使用應用的過程中。前臺的activity在一些時候會被其它的元件遮擋,導致這個activity暫停。舉個樣例。當一個半透明的activity被開啟(比如一個dialog樣式的activity),它之前的activity就會暫停。

假設這個activity長時間一直僅僅能部分可見而且獲取不到當前的焦點。它就保持暫停狀態。

然而,一旦這個activity被全然遮擋而且全然不可見,它就會停止(我們會在下此課程中討論)。

當你的應用進入到暫停狀態,系統會呼叫你的activity的onPause() 方法,它同意你停下正在進行的操作,這些操作不能再暫停狀態繼續(比如播放一個視訊),你還能夠儲存一些當使用者回到應用後須要持久化的資訊。

假設使用者回到你的應用。系統會恢復它,而且呼叫onResume()方法。

提示: 當你的應用接收到onPause()的呼叫時,它可能就表示這個activity將要暫停一會兒,使用者可能會再次回到這個activity。然而。它通常表示使用者離開你的應用的第一步。

圖1. 當一個半透明的activity擋住你的activity,系統會呼叫onPause() 方法。同一時候這個activity將會在Paused 狀態下等待。假設當使用者回到這個activity,它仍處於暫停狀態,那麼系統會呼叫onResume() 方法。.

暫停你的Activity


當系統呼叫你的activity的onPause() 方法時,從技術上來講你的activity仍然部分可見,可是這通常表示使用者正在離開你的activity,同一時候它立即要進入Stopped狀態。

你通常應該使用onPause() 回撥來:

  • 停止可能會消耗CPU資源的動畫或者不論什麼正在進行中的操作。
  • 提交為儲存的改變,前提是當使用者離開這個activity時期望這些改變被儲存(比如一個郵件草稿)。
  • 釋放系統資源,比如廣播接收者。感測器(像GPS)的處理,或者不論什麼將會費電的資源,由於你的activity已經暫停,使用者不再須要它們。

比如,假設你的應用使用到CameraonPause() 方法是一個釋放它的好地方。

@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() 方法來存放使用者的改變(比如填入表單的使用者資訊)至長久的儲存上。

唯一一個須要使用者在onPause方法中持久化使用者改變至永久儲存上的情況是你非常確定使用者期望改變會被自己主動儲存(比如當起草一個email)。

然而,你應該避免在onPause()狀態下執行CPU密集型操作。比如寫資料庫。由於它會減慢切換到下一個activity的速度(作為取代。你應該執行高負載的關閉操作)。

你應該保持這些操作在onPause() 方法中依照相對簡單的順序完畢。這樣。假設你的應用被停止後可以迅速切換到使用者的下一個目的地。

提示: 當你的activity被暫停時,這個Activity 例項被儲存在記憶體中。在activity恢復時會被又一次呼叫。你沒有必要在不論什麼回撥方法中又一次初始化已經建立過的元件來讓activity回到Resumed狀態。

恢復你的Activity


當使用者從Paused狀態恢復activity時,系統會呼叫onResume() 方法。

記住系統在每次activity進入到前臺時都會呼叫這種方法。包含它第一次被建立。

這種話,你就必須在onResume()的實現方法中初始化在onPause()方法被釋放的資源,而且其它的資源僅僅能在activity進入到Resumed狀態下才幹執行初始化操作。

以下這個onResume() 方法的演示樣例相應著上面的onPause() 方法的演示樣例,因此在onResume()方法中要初始化在activity暫停時要釋放的相機資源。

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

相關文章