Activity四大基本狀態
Activity生命周期一般分為四個基本狀態,分別是活動狀態(running),暫停狀態(paused),停止狀態(stopped)和死亡狀態。
活動狀態(running) 活動狀態一般是指該Activity正處於屏幕最顯著的位置上顯示,即該Activity是在Android活動棧的最頂端。 一般地當Activity 創建後就是處於該狀態中。 期間觸發的函數及順序為: onCreate() ->onStart() -> onResume()。 其中: onCreate()只有在該Activity是第一次被創建時才會被調用,主要是負責Activity的一般性的初始化設置,包括視圖的創建,數據的綁定等等。需要注意的是若之前有凍結的state(即系統對該Activity調用過onSaveInstanceState()函數),則可以通過其 Bundle 參數進行state恢復。 onStart()是當Activity正在變為可見狀態時才會被調用。一般地在此期間可以注冊一個廣播等等。 onResume()是在該Activity將要和用戶進行交互時被調用,此時Activity位於的活動棧頂部。
暫停狀態(paused) 暫停狀態一般指該Activity已失去了焦點但仍然是可見的狀態(包括部分可見)。一個處於暫停狀態的Activity只有在系統極度缺乏內存資源的情況下才會被系統強制結束。 運行狀態到暫停狀態所觸發的函數及順序為:onResume() -> onPuased()。 暫停狀態恢復至運行狀態所觸發的函數及順序為:onPuased() -> onResume()。 其中: onPuased()是當一個Activity失去系統焦點後將會被調用,包括見面被部分遮擋,以及設備轉入休眠狀態等等。一般地在此期間對一些未保存的數據進行持久化並停止其他需要耗費CPU的操作,同時不可進行耗時操作,否則會阻塞系統UI線程。
停止狀態(stopped) 停止狀態一般指該Activity被另一個Activity完全覆蓋的狀態,這是它仍然保持所有的狀態,但是由於該Activity變得不可見,所以系統經常會由於內存不足而將該Activity強行結束。 暫停狀態到停止狀態所觸發的函數及順序為:onPuased() -> onStop()。 停止狀態恢復至運行狀態所觸發的函數及順序為:onStop() -> onRestart() -> onStart() -> onResume()。 其中: onStop()是當一個Activity變為不可見時將會被調用,此時可能是由於該Activity要被注銷或新的Activity完全遮擋了該Activity。在此期間一般可以進行取消注冊廣播等操作,因為用戶不可見。 onRestart()是當一個Activity從停止狀態恢復至運行狀態時將會被優先調用。
死亡狀態 死亡態是指該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()函數一樣不能被跳過不執行。
切換橫豎屏觸發的生命周期事件
不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
在Android3.2之前,設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。但在Android3.2及其之後,仍會重新調用各個生命周期一次,因為screen size也開始跟著設備的橫豎切換而改變。
Android3.2及其之後,設置Activity的android:configChanges="orientation|keyboardHidden|screenSize“,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。
總結
關於Android中四大組件之一Activity的生命周期簡介就先寫到這裡了,其實還有很多方面沒介紹到,例如對於onSaveInstanceState()函數和onRestoreInstanceState()函數的用法以及與onPause()函數間的區別都沒涉及,下次有機會再好好總結,不行了實在是困死了,最後若本文有所疏忽及不當之處歡迎大家指正。