7) 十分鐘學會android--Activity的生命週期之暫停與恢複

來源:互聯網
上載者:User

標籤:not   lifecycle   super   執行個體   ref   int   .com   life   撰寫   

在正常使用app時,前端的activity有時會被其他可見的組件阻塞(obstructed),從而導致當前的activity進入Pause狀態。例如,當開啟一個半透明的activity時(例如以對話方塊的形式),之前的activity會被暫停。 只要之前的activity仍然被部分可見,這個activity就會一直處於Paused狀態。

然而,一旦之前的activity被完全阻塞並不可見時,則其會進入Stop狀態(將在下一小節討論)。

activity一旦進入paused狀態,系統就會調用activity中的onPause()方法, 該方法中可以停止不應該在暫停過程中執行的操作,如暫停視頻播放;或者儲存那些有可能需要長期儲存的資訊。如果使用者從暫停狀態回到當前activity,系統應該恢複那些資料並執行onResume()方法。

Note: 當我們的activity收到調用onPause()的訊號時,那可能意味者activity將被暫停一段時間,並且使用者很可能回到我們的activity。然而,那也是使用者要離開我們的activtiy的第一個訊號。

Figure 1. 當一個半透明的activity阻塞activity時,系統會調用onPause()方法並且這個activity會停留在Paused 狀態(1). 如果使用者在這個activity還是在Paused 狀態時回到這個activity,系統則會調用它的onResume() (2).

暫停Activity

當系統調用activity中的onPause(),從技術上講,意味著activity仍然處於部分可見的狀態.但更多時候意味著使用者正在離開這個activity,並馬上會進入Stopped state. 通常應該在onPause()回調方法裡面做以下事情:

  • 停止動畫或者是其他正在啟動並執行操作,那些都會導致CPU的浪費.
  • 提交在使用者離開時期待儲存的內容(例如郵件草稿).
  • 釋放系統資源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何會影響到電量的資源。

例如, 如果程式使用Camera,onPause()會是一個比較好的地方去做那些釋放資源的操作。

@Overridepublic 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()來儲存使用者改變的資料 (例如填入表格中的個人資訊) 到永久儲存(File或者DB)上。僅僅當確認使用者期待那些改變能夠被自動儲存的時候(例如正在撰寫郵件草稿),才把那些資料存到永久儲存 。但是,我們應該避免在onPause()時執行CPU-intensive 的工作,例如寫資料到DB,因為它會導致切換到下一個activity變得緩慢(應該把那些heavy-load的工作放到onStop()去做)。

如果activity實際上是要被Stop,那麼我們應該為了切換的順暢而減少在OnPause()方法裡面的工作量。

Note:當activity處於暫停狀態,Activity執行個體是駐留在記憶體中的,並且在activity 恢複的時候重新調用。我們不需要在恢複到Resumed狀態的一系列回調方法中重新初始化組件。

恢複activity

當使用者從Paused狀態恢複activity時,系統會調用onResume()方法。

請注意,系統每次調用這個方法時,activity都處於前台,包括第一次建立的時候。所以,應該實現onResume()來初始化那些在onPause方法裡面釋放掉的組件,並執行那些activity每次進入Resumed state都需要的初始化動作 (例如開始動畫與初始化那些只有在擷取使用者焦點時才需要的組件)

下面的onResume()的例子是與上面的onPause()例子相對應的。

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

 

 

7) 十分鐘學會android--Activity的生命週期之暫停與恢複

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.