1. 程式人生 > >Android中Activity生命週期

Android中Activity生命週期

    在Android中,Activity的生命週期一直是 比較重要的知識點,即使是在面試中也經常被問到。網上已經有很多人寫過介紹此內容的文章,本文只是自己的總結筆記,便於以後翻閱。首先上圖:

上面那張讓人看起來很爽的圖就是官方文件中關於Activity生命週期的演示圖,Activity共有七個生命週期方法,分別為:

 

第一個方法很熟悉吧,當一個android應用啟動時,首先就會去呼叫onCreate(),onStart(),onResume()方法,然後你就可以看到程式的主介面了,如果這時主介面失去了焦點,被另外一個檢視覆蓋,則會觸發onPause()和onStop()方法,再次返回時,又會依次觸發onRestart(),onStart()和onResume()方法,原先的介面又重新顯示。下面以一個例子具體演示一下。

1、新建Android工程,包含一個按鈕,可以啟動另外一個Activity,程式碼如下

 

上述程式碼生命週期方法中沒有寫具體的內容,為了觀看效果,以log的形式打印出來,可以在LogCat中檢視輸出的內容。不要忘記在AndroidManifest.xml檔案中宣告OtherActivity

 

2、寫好基本程式碼後,最好首先清理一下LogCat控制檯,便於觀察。啟動之後看到如圖所示介面

同時控制檯輸出瞭如下幾行資訊:

其中紅色方框中的資訊為我們想要注意的資訊,此時點選主介面的按鈕,啟動另外一個Activity,注意觀察控制檯輸出:

可以看到呼叫了onPause和onStop方法,這裡需要說明一下,如果啟動的心得Activity並沒有完全遮住前面的Activity,則不會觸發onStop方法,自會觸發onPause方法,這時MainActivity處於暫停狀態,如果想要演示這種效果可以吧OtherActivity的Theme設定為Dialog實驗一下(設定方法是在AndroidManifest.xml中Activity中新增android:theme="@android:style/Theme.Dialog",其他都不用改)。好,接著本程式然後點選鍵盤的返回鍵,返回到前一個頁面,檢視控制檯輸出:

看到有呼叫瞭如上三個方法,這時再次點選返回按鈕,退出程式,檢視LogCat控制檯:

這時呼叫了三個方法,退出了程式,Activity生命週期終結。通過上面的實驗,我們可以非常完整的理解Activity的生命週期,更好的看懂文章開始的圖,同時加深對Activity生命週期的理解。

總結:

    一、在 android 中,Activity 擁有四種基本狀態:

  1. Active/Runing一個新 Activity 啟動入棧後,它在螢幕最前端,處於棧的最頂端,此時它處於可見並可和使用者互動的啟用狀態。
  2. Paused 當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態。此時它依然與視窗管理器保持連線,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與使用者互動。
  3. Stoped 當 Activity 被另外一個 Activity 覆蓋、失去焦點並不可見時處於 Stoped狀態。
  4. Killed Activity 被系統殺死回收或者沒有被啟動時處於 Killed狀態。

    Android 程式設計師可以決定一個 Activity 的“生”,但不能決定它的“死”,也就時說程式設計師可以啟動一個 Activity,但是卻不能手動的“結束”一個 Activity。當你呼叫 Activity.finish()方法時,結果和使用者按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 例項完成了相應的工作,可以被“回收”。隨後 Activity Manager 啟用處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 Activity1 中啟動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當我們呼叫 Activity2.finish()方法時,Activity Manager 重新啟用 Activity1 併入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的資料通過 data引數返回給 Activity1。

    二、Activity棧

    Android 是通過一種 Activity 棧的方式來管理 Activity 的,一個 Activity 的例項的狀態決定它在棧中的位置。處於前臺的 Activity 總是在棧的頂端,當前臺的 Activity 因為異常或其它原因被銷燬時,處於棧第二層的 Activity 將被啟用,上浮到棧頂。當新的 Activity 啟動入棧時,原 Activity 會被壓入到棧的第二層。一個 Activity 在棧中的位置變化反映了它在不同狀態間的轉換。

參考文件: