轉載註明來自: http://www.cnblogs.com/wujiancheng/ 一、正常情況下Activity的生命周期: Activity的生命周期大概可以歸為三部分 整個的生命周期:onCreate()可以設置所有的“全局”狀態, onDestory()可以釋放所有的資源 可見的生命周期 ...
轉載註明來自: http://www.cnblogs.com/wujiancheng/
一、正常情況下Activity的生命周期:
Activity的生命周期大概可以歸為三部分
整個的生命周期:onCreate()可以設置所有的“全局”狀態, onDestory()可以釋放所有的資源
可見的生命周期:onStart()顯示給用戶的UI數據和資源等, onStop()當不再需要顯示時候,可以釋放資源
前臺的生命周期:該生命周期活躍,onResume()回到前臺,onPause()不可見狀態或被覆蓋
不要在onCreate()方法中執行耗時的操作,onStart()及onResume()不可進行過多操作,不然打開桌面應用圖標會卡頓。
(1)onCreate:表示Activity正在被創建。可以調用setContentView載入佈局資源、初始化各控制項、設置監聽、並初始化一些全局的變數。因為在Activity的一次生命周期中,onCreate方法只會執行一次。在Paused和Stopped狀態下恢復或重啟的下,這些控制項、監聽和全局變數也不會丟失。即便是記憶體不足,被回收了,再次Recreate的話,又是一次新的生命周期的開始,又會執行onCreate方法。
(2)onRestart:表示Activity正在重新啟動。當處於非棧頂狀態的活動需要再次返回棧頂,展現給用戶的時候,觸發該方法。調用的場景主要有:home鍵之後,然後切換回來、Activity跳轉到另一個Activity之後,按back鍵返回原來Activity。很少調用,因為它只在onStop之後才可能調用,所以操作放在onStart方法裡面就比較好。
(3)onStart:表示Activity正在啟動,這時Activity已經可見,但是還沒有出現在前臺,還無法和用戶交互。
(4)onResume:表示Activity已經可見了,並且出現在前臺並開始活動。
(5)onPause:表示Activity正在停止,正常情況下,onStop會接著調用,但是打開的是透明的Activity,不會調用onStop,返回會調用onResume。可以執行一些輕量級的釋放工作(耗時會影響到新的Activity顯示,onPause必須執行完,新Activity的生命周期才會執行)例如:停止動畫、取消broadcast receivers等。
(6)onStop:表示Activity將要停止,極有可能被系統所回收,在某些極端情況下,系統可能是直接殺死應用程式的進程,而不是調用onDestory方法,所以我們需要在onStop方法中儘可能的釋放那些用戶暫時不需要使用的資源,防止記憶體泄露。可以做一些稍微重量級的回收工作,例如:數據保存,需要用到的資料庫操作。
(7)onDestory:表示Activity將被銷毀,確定某些資源是否沒有被釋放,做一些最終的清理工作,比如在這個Activity的onCreate中開啟的某個線程,那麼就要在onDestory中確定它是否結束了,如果沒有,就結束它。
幾種生命周期流程的情況:
(1)現在有兩個Activity,A 和B,都重寫了所有的生命周期方法。
進入A,回調:AonCreate-->AonStart-->AonResume。返回桌面:AAonPause-->AonStop。
點擊按鈕進入B,回調:AonPause-->BonCreate-->BonStart-->BonResume-->AonStop。
按下back鍵,回調:BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory
(2)啟動對話框樣式的Activity,有兩個Activity,A 和B(對話框式Activity)。
從A進入B,回調:AonPause-->BonCreate-->BonStart-->BonResume ,並不會調用onStop。
按下back鍵,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回調:BonPause-->AonResume-->BonStop-->BonDestory。
啟動對話框並不會有生命周期的變化,這裡啟動的是透明主題的Activity。
二、關於SaveStateInstance
系統配置發生改變後或記憶體瓶頸時,生命周期發生異常,會調用onSaveInstanceState和onRestoreInstanceState這兩兄弟,這就很好的解決Android應用的記憶體問題。
旋轉屏幕時,生命周期大概如下圖(若不想,可在清單文件設置android:configChanges="orientation|keyboardHidden|locale"
):
onSaveInstanceState:在Activity(onStop之前)被回收之前,系統會調用onSaveInstanceState(Bundle outState)來保存View的狀態,併到傳入的outState對象中。
onRestoreInstanceState:在Activity被重新創建時,會通過onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)傳入保存的狀態信息並恢復View的狀態。(onCreate主要重建Fragment、onRestoreInstanceState恢復Window狀態)
View控制項的狀態被保存需要滿足兩個條件:
1、View有唯一的ID;
2、View的初始化時要調用setSaveEnabled(true)
View控制項恢復的註意三點:
1、如果id重覆,則View的狀態會被覆蓋
2、被保存的Fragment會在onCreate中被自動創建和添加到FragmentActivity中
3、被保存的View不會被自動創建,只是通過id獲取savedInstance用於更新View