生命周期圖,切勿眼高手低
任務(wù)棧:程序打開時(shí)就開啟了一個(gè)任務(wù)棧辈讶,用于記錄用戶開啟的activity命浴,先進(jìn)后出。只有位于任務(wù)棧棧頂?shù)腶ctivity才可以與用戶交互。
啟動(dòng)模式:
1生闲、standard:默認(rèn)值媳溺,標(biāo)準(zhǔn)模式;當(dāng)startActivity的時(shí)候就會創(chuàng)建實(shí)例碍讯,無論任務(wù)棧中是否已經(jīng)存在了該實(shí)例悬蔽。
2、singleTop:棧頂復(fù)用模式捉兴,啟動(dòng)activity時(shí)蝎困,如果該activity位于棧頂,就直接復(fù)用該實(shí)例倍啥,不會再創(chuàng)建實(shí)例(不會調(diào)用該activity的onCreate禾乘、onStart,而是調(diào)用onNewIntent虽缕、onResume)始藕;如果該activity不位于棧頂,還是會創(chuàng)建該activity的實(shí)例氮趋。
3伍派、singleTask:棧內(nèi)復(fù)用模式,啟動(dòng)activity時(shí)凭峡,首先會判斷是不是存在需要的棧拙已,如果不存在需要的任務(wù)棧,就會創(chuàng)建一個(gè)任務(wù)棧摧冀,并創(chuàng)建該activity的實(shí)例倍踪,壓入該棧中;如果存在需要的棧索昂,再判斷該棧中是否存在該activity的實(shí)例建车,如果存在,就會將該activity上面的activity出棧椒惨,調(diào)用該activity的onNewIntent缤至、onResume。如果該棧內(nèi)不存在該activity的實(shí)例康谆,就會創(chuàng)建該activity的實(shí)例领斥,并壓入棧中。判斷是否存在需要的任務(wù)棧沃暗,就需要用到TaskAffinity月洛,TaskAffinity就像是任務(wù)棧的身份證一樣。
4孽锥、singleInstance:單實(shí)例模式嚼黔,加強(qiáng)的singleTask模式细层。啟動(dòng)activity時(shí),會為該activity創(chuàng)建一個(gè)任務(wù)棧唬涧,之后再有別的頁面啟動(dòng)該activity時(shí)疫赎,也不會創(chuàng)建該activity的實(shí)例。
結(jié)合啟動(dòng)模式碎节,查看一下activity的生命周期:
1捧搞、ActivityA和ActivityB都是standard模式,在ActivityA上啟動(dòng)一個(gè)ActivityB:
![DP%7D5]]68PUIK72I]OJ5.png](http://upload-images.jianshu.io/upload_images/2578759-abeaf109394ed9b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
按下home鍵钓株,將應(yīng)用置于后臺实牡,然后返回該應(yīng)用:
![%329])@~RWL(YTD%9)3EP7H.png](http://upload-images.jianshu.io/upload_images/2578759-6b2e385a4528f36d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2陌僵、ActivityA為singleTop模式轴合,在啟動(dòng)ActivityA后,再次啟動(dòng)ActivityA:
按下返回鍵會直接退出ActivityA碗短。
3受葛、ActivityA為standard模式,ActivityB為singleTask模式偎谁,ActivityC不是singgleInstance模式总滩;在ActivityA中啟動(dòng)ActivityB,在ActivityB中啟動(dòng)ActivityC巡雨,在ActivityC中啟動(dòng)ActivityB:
![ZZPBDVC]$]WDN1Q4I)5C2W8.png](http://upload-images.jianshu.io/upload_images/2578759-fc879a7a07d04a27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![]~CI8S{LN%K{3(W%W4]M%34.png](http://upload-images.jianshu.io/upload_images/2578759-93373eb305a382e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
此時(shí)按返回鍵:
4闰渔、橫豎屏切換時(shí)候Activity的生命周期。**
(1)铐望、不設(shè)置Activity的android:configChanges時(shí)冈涧,切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會執(zhí)行一次正蛙,切豎屏?xí)r會執(zhí)行兩次
(2)督弓、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會重新調(diào)用各個(gè)生命周期乒验,切橫愚隧、豎屏?xí)r只會執(zhí)行一次
(3)、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí)锻全,切屏不會重新調(diào)用各個(gè)生命周期狂塘,只會執(zhí)行onConfigurationChanged方法
順便記一下Activity的Flags:
比較常用的標(biāo)記位有:
1、用于設(shè)定Activity的啟動(dòng)模式:
FLAG_ACTIVITY_NEW_TASK:指定“singleTask”啟動(dòng)模式,效果和在Manifest指定一樣
FLAG_ACTIVITY_SINGLE_TOP:指定“singleTop”啟動(dòng)模式鳄厌。
2荞胡、用于影響Activity的運(yùn)行狀態(tài):
FLAG_ACTIVITY_CLEAR_TOP:具有此標(biāo)記的Activity,當(dāng)它啟動(dòng)時(shí)部翘,在同一個(gè)任務(wù)棧中所有位于它上面的Activity都要出棧硝训。如果該Activity的啟動(dòng)模式是singleTask,那么它上面的Activity會出棧,并執(zhí)行該Activity的onNewIntent窖梁、onResume赘风。如果該Activity是standard模式,那么該Activity和它上面的Activity都會出棧纵刘,系統(tǒng)會創(chuàng)建新的Activity實(shí)例并置于棧頂邀窃。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個(gè)標(biāo)記的Activity不會出現(xiàn)在歷史Activity的列表中;等同于在xml置頂屬性:android:excludeFromRecents="true"假哎。