1. 程式人生 > >Android_Activity生命週期全解

Android_Activity生命週期全解

寫在前面: 寫這篇文章,主要的目的是為了理清下自己的思路,服務好自己的同時,更好的服務於大家。

我們需要注意的應該是,我們在什麼時候用哪個生命週期回撥方法做什麼事情。

印象筆記地址,點選

不像其他程式設計正規化一樣:程式從main()方法開始啟動。Android系統根據生命週期的不同階段喚起對應的回撥函式來執行程式碼。系統存在啟動與銷燬一個activity的一套有序的回撥函式。

Activity 是一個應用元件,使用者可與其提供的螢幕進行互動,以執行撥打電話、拍攝照片、傳送電子郵件或檢視地圖等操作。 每個 Activity 都會獲得一個用於繪製其使用者介面的視窗。視窗通常會充滿螢幕,但也可小於螢幕並浮動在其他視窗之上。—By Google

Activity 基本上以三種狀態存在:

  • 繼續/執行

    • 此 Activity 位於螢幕前臺並具有使用者焦點。(有時也將此狀態稱作“執行中”。)
  • 暫停

    • 另一個 Activity 位於螢幕前臺並具有使用者焦點,但此 Activity 仍可見。也就是說,另一個 Activity 顯示在此 Activity 上方,並且該 Activity 部分透明或未覆蓋整個螢幕。 暫停的 Activity 處於完全活動狀態(Activity 物件保留在記憶體中,它保留了所有狀態和成員資訊,並與視窗管理器保持連線),但在記憶體極度不足的情況下,可能會被系統終止。
  • 停止

    • 該 Activity 被另一個 Activity 完全遮蓋(該 Activity 目前位於“後臺”)。 已停止的 Activity 同樣仍處於活動狀態(Activity 物件保留在記憶體中,它保留了所有狀態和成員資訊,但未與視窗管理器連線)。 不過,它對使用者不再可見,在他處需要記憶體時可能會被系統終止。
    • 如果 Activity 處於暫停或停止狀態,系統可通過要求其結束(呼叫其 finish() 方法)或直接終止其程序,將其從記憶體中刪除。(將其結束或終止後)再次開啟 Activity 時,必須重建。

生命週期圖(經簡單翻譯後):

生命週期圖

生命週期方法詳解

onCreate()
執行“全域性”狀態設定(例如定義佈局),建立檢視、將資料繫結到列表等等。
應該在實現內初始化 Activity 的必需元件。
最重要的是,您必須在此方法內呼叫 setContentView(),以定義 Activity 使用者介面的佈局。
onRestart()
在 Activity 已停止並即將再次啟動前呼叫。 始終後接 onStart()。
onStart()


可見。
onResume()
可與使用者互動。
onPause()
通常用於確認對永續性資料的未儲存更改、停止動畫以及其他可能消耗 CPU 的內容,諸如此類。 它應該非常迅速地執行所需操作,因為它返回後,下一個 Activity 才能繼續執行。
做一些必要的操作,比如你想儲存一些資料到資料庫,以方面第二個介面Activity呼叫,則應在 onPause() 而不是 onStop() 執行期間向資料庫寫入資料。
onStop()
不可見/隱藏。
onDestroy()
釋放所有資源。

答疑

1
Android Studio
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

據說在一個APP裡面沒有主Activity入口,程式安裝後,手機程式列表上會沒有應用的那麼在裝置的主介面列表裡面不會呈現你的app圖示。這個我還真沒有測試出來,因為刪掉後,智慧的Android Studio不給執行。Eclipse待測~~~
2
也有網上說,如果直接finish,其會直接呼叫ondestroy方法,不會呼叫onPause,onStop,經我測試,分情況,如果是在生命週期回撥裡直接finish,比如onCreate,那就會直接呼叫ondestroy方法,如果是在onstart裡, 會呼叫onStop,在呼叫ondestroy,如果是在onResume裡finish, 還是會呼叫onPause,onStop,最後 呼叫ondestroy 。如果在其它方法裡面呼叫的話,比如按鈕點選finish,也還是會呼叫onPause,onStop。
3
需要特別注意: 一個activity跳轉到另一個activity(完全覆蓋),自身先只調用onPause,等第二個activity生命週期進入執行狀態了,它才會呼叫自身的onStop方法(注意,如果沒有完全遮擋,不會呼叫onStop)。所以在這裡需要注意的是,不管在哪個activity裡,onPause都不能執行太耗時的操作,不然會延緩跳轉頁面的開啟,同理,可以在onStop方法裡執行善後操作。
4
onSaveInstanceState、onRestoreInstanceState方法並不屬於Android的生命週期回撥方法,需要理清。

  • onRestoreInstanceState

    • 其執行一般在onStart之後,onResume之前。

    • 呼叫時機:它並不是與 onSaveInstanceState成對出現,它出現的時機是activity被系統銷燬了( 人為的不算 ),在建立時會呼叫。

  • onSaveInstanceState

    • 其執行一般在onPause之後,onStop之前。

    • 呼叫時機:如果是要銷燬當前activity,它不會呼叫。跳轉到另一個activity會呼叫;跳轉到桌面會呼叫;在跳轉到一個沒有完全覆蓋的activity(透明、半透明)時,也會呼叫onSaveInstanceState,但不會呼叫onStop,因為其處在暫停狀態;橫豎屏切換時會呼叫。

5
儲存Activity的狀態
當系統為了恢復記憶體而銷燬某項 Activity 時,Activity 物件也會被銷燬,因此係統在繼續 Activity 時根本無法讓其狀態保持完好,而是必須在使用者返回 Activity 時重建 Activity 物件。但使用者並不知道系統銷燬 Activity 後又對其進行了重建,因此他們很可能認為 Activity 狀態毫無變化。 在這種情況下,您可以實現另一個回撥方法對有關 Activity 狀態的資訊進行儲存,以確保有關 Activity 狀態的重要資訊得到保留:onSaveInstanceState()。

系統會先呼叫 onSaveInstanceState(),然後再使 Activity 變得易於銷燬。系統會向該方法傳遞一個 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名稱-值對形式儲存有關 Activity 狀態的資訊。然後,如果系統終止您的應用程序,並且使用者返回您的 Activity,則系統會重建該 Activity,並將 Bundle 同時傳遞給 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法從 Bundle 提取您儲存的狀態並恢復該 Activity 狀態。如果沒有狀態資訊需要恢復,則傳遞給您的 Bundle 是空值(如果是首次建立該 Activity,就會出現這種情況,所以如果要從Bundle取值的話,建議在 onRestoreInstanceState() ,因為其被呼叫時,Activity百分百被銷燬了,所以Bundle不會為空,否則在onCreate()裡還要判斷是否為空)。
如果你什麼都不做
不過,即使您什麼都不做,也不實現 onSaveInstanceState(),Activity 類的 onSaveInstanceState() 預設實現也會恢復部分 Activity 狀態。具體地講,預設實現會為佈局中的每個 View 呼叫相應的 onSaveInstanceState() 方法,讓每個檢視都能提供有關自身的應儲存資訊。Android 框架中幾乎每個小部件都會根據需要實現此方法,以便在重建 Activity 時自動儲存和恢復對 UI 所做的任何可見更改。例如,EditText 小部件儲存使用者輸入的任何文字,CheckBox 小部件儲存複選框的選中或未選中狀態。您只需為想要儲存其狀態的每個小部件提供一個唯一的 ID(通過 android:id 屬性)。如果小部件沒有 ID,則系統無法儲存其狀態。

由於 onSaveInstanceState() 的預設實現有助於儲存 UI 的狀態,因此如果您為了儲存更多狀態資訊而替換該方法,應始終先呼叫 onSaveInstanceState() 的超類實現,然後再執行任何操作。 同樣,如果您替換 onRestoreInstanceState() 方法,也應呼叫它的超類實現,以便預設實現能夠恢復檢視狀態。