在APP的正常使用過程中,在前台工作的Activity有時可能會被其他的可視化元件擋住,而引起Activity進入Paused狀态。舉個例子,當一個半透明的Activity打開後(類似于Dialog那種風格),那麼原先的那個Activity便會進入Paused狀态。隻要Activity仍然隻是部分可見,并且它沒有獲得焦點,那麼它就一直保持在Paused狀态。
然而,隻要activity一旦被全部擋住,并且不可見,那麼就會進入Stopped狀态。
在系統調用Activity的onPause方法時,activity随之就進入了paused狀态,這期間允許你停止一些不應該繼續進行的活動(比如視訊),還應該對使用者的任何資訊做持久化存儲,萬一使用者退出了APP。如果使用者從Paused狀态傳回了Activity,系統會調用onResumed方法并回到Resumed狀态。
Note:當Activity的onPause方法被調用,這意味着Activity可能會在Paused狀态待一會,并且稍後使用者可能會再次傳回到這個Activity中。無論如何,這通常是使用者離開Activity的第一個信号。
上圖:當一個半透明的Activity擋住了原先的Activity,系統會調用onPause方法,然後Activity會等在Paused狀态(1),如果在Paused狀态傳回了Activity,那麼系統會調用onResume方法(2)。
當系統調用了onPause方法,這從技術上說activity目前是部分可見狀态,但是大多數情況下,這表示使用者離開了Activity,并且稍後會進入Stopped狀态。你應該一般使用onPause方法做這些事情:
停止動畫或者運作中的活動等這類消耗CPU資源的行為。
儲存沒有存儲的改變,但這僅限于使用者希望儲存的東西(比如電子郵件的草稿)。
釋放系統資源,比如廣播接收器,正在進行中的傳感器(比如GPS),任何使用者不再需要的,可能會影響到電量的任何資源。
舉個例子,如果應用使用了Camera,在onPause方法中最适合去釋放它。
通常情況下,并不應該使用onPause方法來持久化存儲使用者的改變(比如輸入表格的使用者資訊)。唯一的一點就是使用者希望這些資料可以自動的存儲(比如起草的email)。然而,應該避免在onPause方法中執行高強度的CPU工作,比如寫入資料庫,因為它會減慢切換到下一個Activity的速度(你應該在onStop方法中做這些重量級操作)。
你應該在onPause方法中保持相對簡單的完成操作,為了可以快速過渡到下個Activity。
Note:如果activity在Paused狀态,那麼activity會常駐在記憶體中,它會在activity恢複的時候重新被調用。你不需要重新初始化這些在任何回調函數中被重新建立的元件。
如果使用者從Paused狀态恢複到了Resumed狀态,系統會調用onResume方法。
應該意識到系統每次調用這個方法activity就進入了前台,包括在第一次建立的時候。是以,你應該在onResume中執行個體化元件,然後在onPause中釋放這些元件,每次在activity進入resumed狀态的時候執行其必須的初始化操作(比如啟動動畫和activity擷取到焦點之後隻執行個體化要使用的元件)。
下面這個onPause的例子是上面onResume例子的副本,是以應該在activity暫停的時候釋放初始化過的camera對象。