1.主要內容
本講介紹onPause和onResume,主要分析了在onPause函數中應該執行哪些操作。
2.視頻講解
http://www.eyeandroid.com/thread-11291-1-1.html
3.翻譯參考
在正常的程式使用中,處於前台啟動並執行activity有時會被另外一些可見的組件遮擋,從而造成activity被暫停。比如,一個半透明的activity(類似一個對話方塊)被開啟,先前那個activity就會被暫停。雖然這個activity還有部分可見,但是當前的焦點不在這個activity上,因此它保持在paused狀態。
不過,一旦這個activity被全部遮擋,處於不可見的狀態,那麼它就是被停止了。(下個教程討論) 如果你的activity要進入paused狀態,系統會調用你的activity種的onPause()方法,這個方法讓你能夠暫停那些不應該繼續啟動並執行行為(比如暫停視頻播放),或者儲存那些應該永久儲存的使用者資料。一旦使用者從paused狀態返回,系統能夠調用onResume()方法恢複以前的運行。 提示:當activity接收調用onPause()時,這可能表明activity要暫時進入paused狀態,使用者可能馬上就重新獲得activity的焦點。但是,它也是使用者離開這個activity時會調用的第一個方法。圖解:當一個半透明的activity覆蓋你的activity時,系統調用onPause(),activity就會在Paused狀態中等待(1)。系統調用onResume()方法返回activity。 暫停你的activity當系統調用onPause()方法的時候,技術上說明activity還是能部分可見的,但是大部分情況表明使用者要離開activity,它將進入Stopped狀態。你通常使用onPause()函數做下面的事:
- 停止消耗cpu的動畫或者運行中的動作。
- 提交未儲存的更改,但是只是儲存使用者離開後期望永久儲存的東西(比如郵件草稿)。
- 釋放系統資源,比如廣播接收器,感應器(比如GPS),或者消耗電量的資源,這些資源是activity暫停後使用者不再需要的。
例如,如果你的程式需要使用網路攝影機,onPause()方法中是釋放它的好地方。
- @Override
- public void onPause() {
- super.onPause(); // 通常先調用父類方法
-
- // 釋放網路攝影機資源
- if (mCamera != null) {
- mCamera.release()
- mCamera = null;
- }
- }
通常情況下,你不需要使用onPause()方法儲存使用者的修改(比如填寫資訊的表單)到固定儲存空間。只有在使用者真的期望自動儲存資料(比如郵件草稿)的時候才需要在onPause()方法中儲存。你應該盡量避免在onPause()方法中讓CPU進行密集的工作,比如寫入資料到資料庫,因為這樣會減慢你進入下一個activity的速度(你應該在onStop()中執行這些高負載的關閉操作)。 如果你的activity確實需要被停止話,你應該保持你onPause()方法盡量的簡單,這樣能夠保證快速的轉換到使用者的下一個目的地。 提示:當你的activity已經被paused,這個activity執行個體會被保持在記憶體中,當activity需要被恢複的時候被調用。你不需要再重新初始化組件。 恢複你的activity
當使用者從Paused狀態恢複你的activity的時候,系統調用onResume()函數。 需要瞭解的是activity每次進入前台都會調用這個方法,包括activity被第一次建立的時候。這樣的話,你必須在onResume()方法中初始化那些onPause()中釋放的組件,並且執行任何需要在Resumed狀態中需要的初始化工作。(比如開始動畫和初始化activity前台狀態需要的組件) 下面的例子和上面onPause()的例子相對應,這裡初始化暫停時釋放的網路攝影機資源。
- @Override
- public void onResume() {
- super.onResume(); // 調用父類方法
-
- // 當activity取得使用者焦點時取得網路攝影機執行個體
- if (mCamera == null) {
- initializeCamera(); // 網路攝影機初始化的本地方法
- }
- }