1. 程式人生 > >Android之Activity生命週期簡介

Android之Activity生命週期簡介

概述

有圖有真相,所以先上圖:

enter image description here

上圖是從Android官網截下的Activity的生命週期流程圖,結構非常清晰,它描述了Activity在其生命週期中所有可能發生的情況以及發生的先後順序,下面就將結合此圖詳細介紹一下Activity的生命週期。
--- ---

Activity四大基本狀態

Activity生命週期一般分為四個基本狀態,分別是活動狀態(running),暫停狀態(paused),停止狀態(stopped)和死亡狀態。

  1. 活動狀態(running)
    活動狀態一般是指該Activity正處於螢幕最顯著的位置上顯示,即該Activity是在Android活動棧的最頂端。
    一般地當Activity 建立後就是處於該狀態中。
    期間觸發的函式及順序為: onCreate() ->onStart() -> onResume()。
    其中:
    onCreate()只有在該Activity是第一次被建立時才會被呼叫,主要是負責Activity的一般性的初始化設定,包括檢視的建立,資料的繫結等等。需要注意的是若之前有凍結的state(即系統對該Activity呼叫過onSaveInstanceState()函式),則可以通過其 Bundle 引數進行state恢復。
    onStart()是當Activity正在變為可見狀態時才會被呼叫。一般地在此期間可以註冊一個廣播等等。
    onResume()是在該Activity將要和使用者進行互動時被呼叫,此時Activity位於的活動棧頂部。

  2. 暫停狀態(paused)
    暫停狀態一般指該Activity已失去了焦點但仍然是可見的狀態(包括部分可見)。一個處於暫停狀態的Activity只有在系統極度缺乏記憶體資源的情況下才會被系統強制結束。
    執行狀態到暫停狀態所觸發的函式及順序為:onResume() -> onPuased()。
    暫停狀態恢復至執行狀態所觸發的函式及順序為:onPuased() -> onResume()。
    其中:
    onPuased()是當一個Activity失去系統焦點後將會被呼叫,包括見面被部分遮擋,以及裝置轉入休眠狀態等等。一般地在此期間對一些未儲存的資料進行持久化並停止其他需要耗費CPU的操作,同時不可進行耗時操作,否則會阻塞系統UI執行緒。

  3. 停止狀態(stopped)
    停止狀態一般指該Activity被另一個Activity完全覆蓋的狀態,這是它仍然保持所有的狀態,但是由於該Activity變得不可見,所以系統經常會由於記憶體不足而將該Activity強行結束。
    暫停狀態到停止狀態所觸發的函式及順序為:onPuased() -> onStop()。
    停止狀態恢復至執行狀態所觸發的函式及順序為:onStop() -> onRestart() -> onStart() -> onResume()。
    其中:
    onStop()是當一個Activity變為不可見時將會被呼叫,此時可能是由於該Activity要被登出或新的Activity完全遮擋了該Activity。在此期間一般可以進行取消註冊廣播等操作,因為使用者不可見。
    onRestart()是當一個Activity從停止狀態恢復至執行狀態時將會被優先呼叫。
  4. 死亡狀態
    死亡態是指該Activity被系統銷燬。當一個Activity處於暫停狀態或停止狀態時就隨處可能進入死亡狀態,因為系統可能因記憶體不足而強行結束該Activity。
    停止狀態到死亡狀態分為兩種情況:(1)由使用者操作導致,則執行:onStop() -> onDestroy()。(2)由系統自動強制執行,則該Activity被強行結束。
    其中:
    onDestroy()是當一個Activity正在被系統finished期間被呼叫的。
    --- ---

    Activity七大生命週期函式

    Activity一共有七個生命週期函式,分別為onCreate(),onRestart(),onStart(),onReusme(),onPause(),onStop(),onDestory()。它們的被呼叫的情況以及作用已在上一段中進行了相關的介紹分析,在此就不再贅述。
    其實在一個Activity整個生命週期中上述七大生命週期函式並不是一定都會被執行的,有時由於系統記憶體不足的緣故,部分生命週期函式將會被跳過不執行。
    一般地onCreate(),onRestart(),onStart(),onReusme()這四個函式是不能被系統跳過不執行的,而onDestory()函式在系統記憶體不足時,該函式將直接被系統跳過不執行。
    onPause()函式比較特殊,即使在系統記憶體不足時,也一定會執行完該函式後其Activity才會被強制結束,原因是下一個Activity在等到該函式結束前前是不會繼續進行。所以該函式常常用於對資料的持久化操作,同時也禁止進行任何耗時的操作。
    onStop()函式則最為特殊,當Android的執行環境為HONEYCOMB即3.0之前的版本時,onStop()函式是可以被系統跳過不執行的。但是在HONEYCOMB即3.0之後的版本,onStop()函式和onPause()函式一樣不能被跳過不執行。
    --- ---

    切換橫豎屏觸發的生命週期事件

  5. 不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
  6. 設定Activity的android:configChanges=”orientation”時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。
  7. 在Android3.2之前,設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。但在Android3.2及其之後,仍會重新呼叫各個生命週期一次,因為screen size也開始跟著裝置的橫豎切換而改變。
  8. Android3.2及其之後,設定Activity的android:configChanges="orientation|keyboardHidden|screenSize“,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。
    --- ---

    總結

    關於Android中四大元件之一Activity的生命週期簡介就先寫到這裡了,其實還有很多方面沒介紹到,例如對於onSaveInstanceState()函式和onRestoreInstanceState()函式的用法以及與onPause()函式間的區別都沒涉及,下次有機會再好好總結,不行了實在是困死了,最後若本文有所疏忽及不當之處歡迎大家指正。