android Activity的onPause()與onResume()

許佳佳233發表於2016-03-24

官方文件地址:http://www.android-doc.com/training/basics/activity-lifecycle/pausing.html#Resume

 

Pause和Resume一個Activity

在一般的app使用中,前臺的activity一般是會被視覺元件所遮住的,這就會導致activity的pause。舉個例子,當一個半透明的activity開啟的時候(就像某種形式的對話方塊一樣),這之前的activity會pause。只要activity仍然部分可見,但是當下activity並不可操作,它就處在pause中了。

但是,一旦這個activity全部被遮住了,並且不可見,它就stop了。(這會在下節課討論到)

當你的activity進入pause狀態的時候,這個系統呼叫了在activity中的onPause()這個方法,onPause ()這個方法讓你能夠結束一些正在進行的任務,而這些任務在停止的時候就不能繼續了(比如一個視訊)。它也能夠讓你在使用者執意要離開你的app時,留存應該被永久儲存的資訊。如果使用者從pause的狀態又回到了你的activity,這個系統resume這個activity並且呼叫了onResume()這個方法。

 

注意:當你的activity收到了一個呼叫onPause()的請求,它可能表示這個activity將會被停止一段時間並且使用者很可能會再次回到你的activity來。但是這也很可能表示著使用者正在離開你的app。

 

圖片:當一個半透明的activity遮住了你的activity,這個系統呼叫了onPause(),並且activity在pause的狀態中等待。如果使用者當它仍然pause的時候再次回到了activity,這個系統會呼叫onResume()。

 

pause你的Activity

當這個系統為你的activity呼叫onPause()的時候,講道理的話,它意味著你的activity仍然是部分可見的,但是也非常有可能表示是使用者正在離開你的activity並且它之後將很快進入stop的狀態。你應該經常會在以下情況下用到onPause()。

1、  結束佔用CPU的動畫或者其他正在執行任務。

2、  提交沒有儲存的改變,但是隻有在使用者離開的時候希望這些改變被儲存的時候。

3、  釋放系統資源,就像廣播接收者,對感測器的操縱(就像GPS),或者在acitivity被pause之後和使用者不需要的時候,任何可能影響你電池壽命的資源。

 

舉個例子,如果你的應用用到了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()來儲存使用者的改變到永久的儲存空間中(比如表單輸入個人資訊)。唯一的你需要用onPause()來把使用者的改變儲存到永久記憶體中的情況是,當你的某縣使用者需要自動化儲存的時候(比如寫一封email)。但是在onPause()中你應該避免執行佔用大量CPU的工作,比如寫入資料庫。因為這會減慢你視覺化轉換到下一個activity的速度。(你應該把這種繁重的關閉操作放到onstop()中)

在onPause()方法中,你應該要保持一部分的操作,來保證你的activity結束的時候能夠以較快的速度跳轉到下一個使用者目的地。

 

注意:當你的activity被pause的時候,這個activity例項在記憶體中是佔用位置的,而且在Activity被resume的時候會被再次喚醒。你不需要在resume狀態之前的任何回撥函式中,重新初始化任何已經被建立過的元件。

 

resume你的Activity

當使用者從pause的狀態resume你的activity的時候,系統呼叫了onResume()的函式。

 

考慮到系統每次進入前臺執行的時候都會呼叫這個函式,即使是在這個activity已經被建立過的情況下。同樣的你應該實現onResume()來初始化你在onPause()中釋放的元件,並且並且執行一些其他在當activity進入resume狀態的時候需要執行的初始化(比如開啟動畫,初始化只有activity獲取了焦點後才需要使用的元件)。

 

接下來的onResume()的例子是與onPause()在上面的例子相配的,所以它初始化了在activity被pause的時候需要釋放的camera。

 

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

 

 

 

 

 

相關文章