Android學習筆記(五)——活動的生命週期

來源:互聯網
上載者:User

標籤:

  //此系列博文是《第一行Android代碼》的學習筆記,如有錯漏,歡迎指正!

  為了能寫出流暢連貫的程式,我們需要瞭解一下活動的生命週期。

一、返回棧

  Android 中的活動是可以層疊的。我們每啟動一個新的活動,就會覆蓋在原活動之上,然後點擊 Back 鍵會銷毀最上面的活動。事實上,Android 是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裡的活動的集合,這個棧也被稱作返回棧(Back Stack) 。預設情況
下,每當我們啟動了一個新的活動,它會在返回棧中入棧,並處於棧頂的位置。而系統總是會顯示處於棧頂的活動給使用者。另外,每當我們按下 Back 鍵或調用 finish()方法去銷毀一個活動時,處於棧頂的活動會出棧。

二、活動的四種狀態

  1)運行狀態

    當一個活動位於返回棧的棧頂時,這時活動就處於運行狀態。
  2)暫停狀態
    當一個活動不再處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態。比如對話方塊形式的活動只會佔用螢幕中間的部分地區,當它不位於棧頂時,可能仍然是可見的。處於暫停狀態的活動仍然是完全存活著的,系統也一般不回去去回收這種活動(因為它還是可見的,回收可見的東西都會在使用者體驗方面有不好的影響) ,只有在記憶體極低的情況下,系統才會去考慮回收這種活動。
  3)停止狀態
    當一個活動不再處於棧頂位置,並且完全不可見的時候,就進入了停止狀態。系統仍然會為這種活動儲存相應的狀態和成員變數,但是這並不是完全可靠的,當其他地方需要記憶體時,處於停止狀態的活動有可能會被系統回收。
  4)銷毀狀態
    當一個活動從返回棧中移除後就變成了銷毀狀態。 系統會一般會回收處於這種狀態的活動,從而保證手機的記憶體充足。

三、活動的生存周期

  首先瞭解一下Activity類中的7個回調方法:

  1.  onCreate()
    每個活動中我們都重寫了這個方法,它會在活動第一次被建立的時候調用。我們應該在這個方法中完成活動的初始化操作,比如說載入布局、綁定事件等。
  2.  onStart()
    這個方法在活動由不可見變為可見的時候調用。
  3.  onResume()
    這個方法在活動準備好和使用者進行互動的時候調用。 此時的活動一定位於返回棧的棧頂,並且處於運行狀態。
  4.  onPause()
    這個方法在系統準備去啟動或者恢複另一個活動的時候調用。 我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及儲存一些關鍵資料,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。
  5.  onStop()
    這個方法在活動將要變成完全不可見的時候調用。它和 onPause()方法的主要區別在於,如果啟動的新活動是一個對話方塊式的活動,那麼 onPause()方法會得到執行,而 onStop()方法並不會執行。
  6.  onDestroy()
    這個方法在活動將被銷毀時調用,之後活動的狀態將變為銷毀狀態。
  7.  onRestart()
    這個方法在活動由停止狀態變為運行狀態的時候調用,也就是活動被重新啟動了。

  根據以上的回調方法,一個活動可以被分為三個周期:
  1)完整生存期
    活動在 onCreate()方法和 onDestroy()方法之間所經曆的,就是完整生存期。一般情況下,一個活動會在 onCreate()方法中完成各種初始化操作,而在 onDestroy()方法中完成釋放記憶體的操作。

  2)可見生存期
    活動在 onStart()方法和 onStop()方法之間所經曆的,就是可見生存期。在可見生存期內,活動對於使用者總是可見的,即便有可能無法和使用者進行互動。我們可以通過這兩個方法,合理地管理那些對使用者可見的資源。比如在 onStart()方法中對資源進行載入,而在 onStop()方法中對資源進行釋放, 從而保證處於停止狀態的活動不會佔用過多記憶體。

  3)前台生存期
    活動在 onResume()方法和 onPause()方法之間所經曆的,就是前台生存期。在前台生存期內,活動總是處於運行狀態的,此時的活動是可以和使用者進行相互的,我們平時看到和接觸最多的也這個狀態下的活動。

四、onSaveInstanceState()方法

  假如我們的MainActivity 中有一個文本輸入框,現在我輸入了一段文字,然後啟動另一個,這時 MainActivity 由於系統記憶體不足被回收掉,過了一會我又點擊了Back 鍵回到 MainActivity,這時候剛剛輸入的文字全部都沒了,因為 MainActivity被重新建立了。為瞭解決這個問題,我們可以onSaveInstanceState()方法:

  onSaveInstanceState()方法會攜帶一個 Bundle 類型的參數,Bundle 提供了一系列的方法用於儲存資料,比如可以使用 putString()方法儲存字串,使用 putInt()方法儲存整型資料,以此類推。每個儲存方法需要傳入兩個參數,第一個參數是鍵,用於後面從 Bundle 中取值,第二個參數是真正要儲存的內容。

  例如我們可以在MainActivity中添加下列代碼來儲存臨時資料: 

1 @Override2 protected void onSaveInstanceState(Bundle outState) {3     super.onSaveInstanceState(outState);4     String tempData = "Something you just typed";5     outState.putString("data_key", tempData);6 }

   而要將資料提取出來的話,只需使用onCreate()中的那個Bundle類型的savedInstanceState參數即可,假如之前沒有用onSaveInstanceState儲存資料的話,它的值是null。程式碼範例如下:

1 @Override2 protected void onCreate(Bundle savedInstanceState) {3     super.onCreate(savedInstanceState);4     setContentView(R.layout.activity_main);5     if (savedInstanceState != null) {6     String tempData = savedInstanceState.getString("data_key");7     }8     //……9 }

   

  //End.

Android學習筆記(五)——活動的生命週期

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.