1. 程式人生 > >Activity生命週期詳解

Activity生命週期詳解

Activity是什麼?

Activity是使用者和應用程式互動的介面,使用者可以在Activity上進行點選、滾動、觸控等操作。一般來說,一個應用是由多個Activity組成,首次進入的Activity稱為主Activity。至於如何判斷一個Activity是不是主Activity。本篇文章我們先不討論。後面會講到。

Activity的活動狀態

當我查閱關於Activity的官方文件的時候,我發現,官方文件中談到Activity有三種狀態,執行中、暫停、停止。我覺得少了一個銷燬。所以這邊我簡單介紹一下Activity的四種活動狀態。

  • 執行中(running)
    此acitvity位於前臺,並且使用者可以在activity中執行觸控、點選、滾動等操作。
  • 暫停(paused)
    activity可見,但並不可以操作,比如,當一個彈窗彈出來的時候。
  • 停止(stopped)
    activity不可見,一般來說當用戶按了home鍵之後。如果系統記憶體不夠的時候,並且其他應用需要記憶體時,系統會回收已經停止的activity。
  • 銷燬(destroy)
    activity不可見,一般處於這種狀態的activity會被系統回收掉。

Activity的生命週期

首先我們先看下圖解是怎麼描述activity的生命週期的。

在正常情況下,Acitivity的生命週期會先後經歷如下的生命週期:

1)onCreate:表示Activity正在被建立,一般來說,我們會在這個方法中設定佈局以及一些資料的初始化。

2)onStart:表示Activity正在被啟動,這個Activity已經可見,但並不是前臺,這種情況下,我們無法操作這個Activity。

3)onResume:表示Activity已經可見並且位於前臺了,此時,我們可以對當前的Activity進行操作。

4)onPasue:表示Activity暫停了,一般來說,執行到了這一步,後續會呼叫onStop方法。所以,在這邊我們儘可能不要去執行耗時操作,因為這會影響新的Activity的顯示。

5)onStop:表示Activity停止了,這邊我們可以對一些資料進行回收。同樣不能太耗時。

6)onDestroy:表示Activity即將銷燬,這是Activity最後一個生命週期,同樣,我們可以對一些資料進行回收。

7)onRestart:表示Activity正在被重啟,這個方法一般只有在重啟Activity的時候才被呼叫,比如,開啟一個新的Activity然後在回退到當前的Activity。此方法便會被呼叫。

我們可以通過上述介紹以及圖片,可以分析出一般Activity會有如下幾種情況:

啟動一個Activity:onCreate()–>onStart()–>onResume()。

按Home鍵之後或者重新開啟一個Activity:onPause()–> onStop()(注:如果新的Activity是透明主題,當前Acitvity不會走onStop方法,例如dialog彈出的時候,當然,dialog關閉當前Activity會走onResume())。

重新啟動一個Activity:onRestart()–>onStart()–>onResume()。

銷燬一個Activity:onPasue()–>onStop()–>onDestroy()。

異常情況下Activity的生命週期

首先,我們需要什麼情況算異常情況。最好的例子莫過於橫豎屏切換,這種情況Activity會被銷燬並且重建,一般來說,系統會呼叫onSaveInstanceState 方法進行資料的儲存。然後通過呼叫onRestoreInstanceState進行資料的恢復。如果我們想知道當前activity是否被重建了。我們可以在onCreate中判斷bundle是否為null或者重寫onRestoreInstanceState方法。一般推薦使用後者,因為只有在重建的情況下,此方法才會被呼叫。

如果我們希望當系統配置引數發生改變時,當前Activity不會被重建應該怎麼做呢?自然是有的,我們可以在Mainfest檔案中為Activity配置configChanges屬性。比如,我們想當螢幕切換的時候當前Activity不被重啟。我們可以這樣:

  android:configChanges="orientation|screenSize"

configChanges的選項有很多,這裡我們常用的只有locale、orentation、keyboardHidden以及screenSize。(需要注意的是:screenSize這個屬性比較特殊,minSdkVersion 和targetSdkVersion 低於13時,此選項不會導致activity重啟。否則會導致activity重啟。)

此時,我們可以通過重寫此方法來進行一些特殊處理:

      @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
        }

Thanks

《Android開發藝術探索》