歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Training - 暫停和恢復一個Activity

Android Training - 暫停和恢復一個Activity

日期:2017/3/1 10:13:52   编辑:Linux編程

在正常的程序使用中,處於前台運行的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()方法中是釋放它的好地方。

  1. @Override
  2. public void onPause() {
  3. super.onPause(); // 通常先調用父類方法
  4. // 釋放攝像頭資源
  5. if (mCamera != null) {
  6. mCamera.release()
  7. mCamera = null;
  8. }
  9. }

通常情況下,你不需要使用onPause()方法儲存用戶的修改(比如填寫信息的表單)到固定存儲器。只有在用戶真的期望自動保存數據(比如郵件草稿)的時候才需要在onPause()方法中保存。你應該盡量避免在onPause()方法中讓CPU進行密集的工作,比如寫入數據到數據庫,因為這樣會減慢你進入下一個activity的速度(你應該在onStop()中執行這些高負載的關閉操作)。

如果你的activity確實需要被停止話,你應該保持你onPause()方法盡量的簡單,這樣能夠保證快速的轉換到用戶的下一個目的地。

提示:當你的activity已經被paused,這個activity實例會被保持在內存中,當activity需要被恢復的時候被調用。你不需要再重新初始化組件。

恢復你的activity

當用戶從Paused狀態恢復你的activity的時候,系統調用onResume()函數。

需要了解的是activity每次進入前台都會調用這個方法,包括activity被第一次創建的時候。這樣的話,你必須在onResume()方法中初始化那些onPause()中釋放的組件,並且執行任何需要在Resumed狀態中需要的初始化工作。(比如開始動畫和初始化activity前台狀態需要的組件)

下面的例子和上面onPause()的例子相對應,這裡初始化暫停時釋放的攝像頭資源。

  1. @Override
  2. public void onResume() {
  3. super.onResume(); // 調用父類方法
  4. // 當activity取得用戶焦點時取得攝像頭實例
  5. if (mCamera == null) {
  6. initializeCamera(); // 攝像頭初始化的本地方法
  7. }
  8. }
Copyright © Linux教程網 All Rights Reserved