1. 程式人生 > >android Activity的onPause()與onResume()

android Activity的onPause()與onResume()

工作 速度 enter stop rst ont 初始 大量 這也

官方文檔地址: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
    }
}


android Activity的onPause()與onResume()