一胀蛮、正常情況下Activity的生命周期:
Activity的生命周期大概可以歸為三部分
整個的生命周期:onCreate()可以設(shè)置所有的“全局”狀態(tài)验烧, onDestory()可以釋放所有的資源
可見的生命周期:onStart()顯示給用戶的UI數(shù)據(jù)和資源等, onStop()當(dāng)不再需要顯示時候,可以釋放資源
前臺的生命周期:該生命周期活躍甸怕,onResume()回到前臺挠羔,onPause()不可見狀態(tài)或被覆蓋
不要在onCreate()方法中執(zhí)行耗時的操作盖奈,onStart()及onResume()不可進行過多操作宪塔,不然打開桌面應(yīng)用圖標會卡頓磁奖。
(1)onCreate:表示Activity正在被創(chuàng)建∧晨穑可以調(diào)用setContentView加載布局資源比搭、初始化各控件、設(shè)置監(jiān)聽南誊、并初始化一些全局的變量身诺。因為在Activity的一次生命周期中,onCreate方法只會執(zhí)行一次抄囚。在Paused和Stopped狀態(tài)下恢復(fù)或重啟的下霉赡,這些控件、監(jiān)聽和全局變量也不會丟失幔托。即便是內(nèi)存不足穴亏,被回收了,再次Recreate的話重挑,又是一次新的生命周期的開始嗓化,又會執(zhí)行onCreate方法。
(2)onRestart:表示Activity正在重新啟動谬哀。當(dāng)處于非棧頂狀態(tài)的活動需要再次返回棧頂蟆湖,展現(xiàn)給用戶的時候,觸發(fā)該方法玻粪。調(diào)用的場景主要有:home鍵之后,然后切換回來诬垂、Activity跳轉(zhuǎn)到另一個Activity之后劲室,按back鍵返回原來Activity。很少調(diào)用结窘,因為它只在onStop之后才可能調(diào)用很洋,所以操作放在onStart方法里面就比較好。
(3)onStart:表示Activity正在啟動隧枫,這時Activity已經(jīng)可見喉磁,但是還沒有出現(xiàn)在前臺谓苟,還無法和用戶交互。
(4)onResume:表示Activity已經(jīng)可見了协怒,并且出現(xiàn)在前臺并開始活動涝焙。
(5)onPause:表示Activity正在停止,正常情況下孕暇,onStop會接著調(diào)用仑撞,但是打開的是透明的Activity,不會調(diào)用onStop妖滔,返回會調(diào)用onResume隧哮。可以執(zhí)行一些輕量級的釋放工作(耗時會影響到新的Activity顯示座舍,onPause必須執(zhí)行完沮翔,新Activity的生命周期才會執(zhí)行)例如:停止動畫、取消broadcast?receivers等曲秉。
(6)onStop:表示Activity將要停止采蚀,極有可能被系統(tǒng)所回收,在某些極端情況下岸浑,系統(tǒng)可能是直接殺死應(yīng)用程序的進程搏存,而不是調(diào)用onDestory方法,所以我們需要在onStop方法中盡可能的釋放那些用戶暫時不需要使用的資源矢洲,防止內(nèi)存泄露璧眠。可以做一些稍微重量級的回收工作读虏,例如:數(shù)據(jù)保存责静,需要用到的數(shù)據(jù)庫操作。
(7)onDestory:表示Activity將被銷毀盖桥,確定某些資源是否沒有被釋放灾螃,做一些最終的清理工作,比如在這個Activity的onCreate中開啟的某個線程揩徊,那么就要在onDestory中確定它是否結(jié)束了腰鬼,如果沒有,就結(jié)束它塑荒。
幾種生命周期流程的情況:
(1)現(xiàn)在有兩個Activity熄赡,A 和B,都重寫了所有的生命周期方法齿税。
進入A彼硫,回調(diào):AonCreate-->AonStart-->AonResume。返回桌面:AAonPause-->AonStop。
點擊按鈕進入B,回調(diào):AonPause-->BonCreate-->BonStart-->BonResume-->AonStop拧篮。
按下back鍵词渤,回調(diào):BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory
(2)啟動對話框樣式的Activity,有兩個Activity串绩,A
和B(對話框式Activity)缺虐。
從A進入B,回調(diào):AonPause-->BonCreate-->BonStart-->BonResume赏参,并不會調(diào)用onStop志笼。
按下back鍵,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回調(diào):BonPause-->AonResume-->BonStop-->BonDestory把篓。
啟動對話框并不會有生命周期的變化纫溃,這里啟動的是透明主題的Activity。
二韧掩、關(guān)于SaveStateInstance
系統(tǒng)配置發(fā)生改變后或內(nèi)存瓶頸時紊浩,生命周期發(fā)生異常,會調(diào)用onSaveInstanceState和onRestoreInstanceState這兩兄弟疗锐,這就很好的解決Android應(yīng)用的內(nèi)存問題坊谁。
旋轉(zhuǎn)屏幕時,生命周期大概如下圖(若不想滑臊,可在清單文件設(shè)置android:configChanges="orientation|keyboardHidden|locale")
onSaveInstanceState:在Activity(onStop之前)被回收之前口芍,系統(tǒng)會調(diào)用onSaveInstanceState(Bundle outState)來保存View的狀態(tài),并到傳入的outState對象中雇卷。
onRestoreInstanceState:在Activity被重新創(chuàng)建時鬓椭,會通過onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)傳入保存的狀態(tài)信息并恢復(fù)View的狀態(tài)。(onCreate主要重建Fragment关划、onRestoreInstanceState恢復(fù)Window狀態(tài))
View控件的狀態(tài)被保存需要滿足兩個條件:
1小染、View有唯一的ID;
2贮折、View的初始化時要調(diào)用setSaveEnabled(true)
View控件恢復(fù)的注意三點:
1裤翩、如果id重復(fù),則View的狀態(tài)會被覆蓋
2调榄、被保存的Fragment會在onCreate中被自動創(chuàng)建和添加到FragmentActivity中
3踊赠、被保存的View不會被自動創(chuàng)建,只是通過id獲取savedInstance用于更新View