(本文同步在個(gè)人Google博客中)
Lifecycle與Launch Mode的學(xué)習(xí)筆記而已。
1. Activity Lifecycle
http://developer.android.com/reference/android/app/Activity.html
---基本來(lái)自官方介紹,結(jié)合O'REILLY家的《Hello, Android》這本書(shū)
Android的activity有各種各樣的狀態(tài)概而,直接由下圖表示:(Activity的啟動(dòng)抽高,終止欢策,中止哼丈,恢復(fù)等都符合下圖流程臣樱,通過(guò)自動(dòng)調(diào)用圖中的onXX()函數(shù)進(jìn)行狀態(tài)的改變)
明白lifecycle有4個(gè)state撼短,3個(gè)loop即可再膳,兩者結(jié)合起來(lái)理解。
4個(gè)state:
1)running--在程序最前端曲横,動(dòng)態(tài)階段
2)paused(visible)--暫停階段喂柒,但是可見(jiàn)的(比如彈出dialog或半透明widget,背后的activity還是可見(jiàn)的)
3)stoped(invisible)--停止階段禾嫉,已經(jīng)不可見(jiàn)灾杰,僅在后臺(tái)保存著狀態(tài)與信息。當(dāng)系統(tǒng)內(nèi)存不足時(shí)這是最容易被殺死的狀態(tài)熙参。
4)killed--進(jìn)程已被殺死階段艳吠,從內(nèi)存中釋放出來(lái)。當(dāng)需要再次展示給用戶時(shí)孽椰,就必須重新onCreate()或onRestart() 昭娩。
3個(gè)loop:
1) entire lifetime--from onCreate() to onDestory()
完整的生命周期。進(jìn)程在這個(gè)周期里始終是“存在”的狀態(tài)黍匾。
2) visible lifetime--from onStart() to onStop()
可見(jiàn)的生命周期栏渺。進(jìn)程在這個(gè)周期里始終是“可見(jiàn)”的狀態(tài),可見(jiàn)狀態(tài)與信息都占據(jù)著內(nèi)存锐涯。
3)foreground lifetime --from onResume() to onPause()
最前端的生命周期磕诊。進(jìn)程在這個(gè)周期里就在任務(wù)棧的最頂端,始終running的狀態(tài)全庸。
在進(jìn)程切換狀態(tài)前后想要改寫Activity的信息之類的秀仲,就Override對(duì)應(yīng)的onXX()函數(shù)即可。
但此外還有兩個(gè)常用的函數(shù):
* onSaveInstanceState(Bundle)
* onRestoreInstanceState(Bundle)
前者在一時(shí)停止onPause()之前調(diào)用:
onSaveInstanceState(Bundle)--->onPause()
調(diào)用之后再恢復(fù)進(jìn)程壶笼,就會(huì)調(diào)用后者神僵,與其他函數(shù)的順序?yàn)椋?/p>
onCreate(Bundle)--->onStart()--->onRestoreInstanceState(Bundle)--->onResume()
動(dòng)態(tài)instance通過(guò)Bundle保存進(jìn)來(lái),在onCreate(Bundle)或onRestoreInstanceState(Bundle)中提取Bundle恢復(fù)覆劈。
但是Google官網(wǎng)也說(shuō)了保礼,這兩個(gè)函數(shù)不屬于生命周期內(nèi)部函數(shù)沛励。所以有可能不會(huì)被調(diào)用。還是不推薦使用這兩個(gè)函數(shù)炮障。
雖然個(gè)人覺(jué)得在activity橫豎屏切換時(shí)調(diào)用onSaveInstanceState(Bundle)保存輸入字符目派,其他動(dòng)態(tài)instance還挺好用的。= =|||
2. Launch Mode
http://developer.android.com/guide/topics/manifest/activity-element.html
http://developer.android.com/guide/components/tasks-and-back-stack.html
?---還是參照Developers官方介紹
Launch Mode是AndroidManifest.xml中Activity設(shè)置參數(shù):
android:launchMode=["standard"|"singleTop"|"singleTask"|"singleInstance"]
1)standard: 默認(rèn)設(shè)置胁赢。
如下圖任務(wù)棧所示企蹭,一調(diào)用startActivity()就會(huì)產(chǎn)生新的實(shí)例。于是也有可能一個(gè)activity被調(diào)用多次而沒(méi)有正常退出智末,產(chǎn)生好幾個(gè)實(shí)例谅摄。
2)singleTop:
顧名思義,任務(wù)棧只有單一的頂端系馆。每次調(diào)用startActivity()時(shí)會(huì)檢查棧頂送漠,若是相同activity則啟動(dòng)onNewIntent()的方法,而不重新創(chuàng)建新的實(shí)例由蘑。
比如QQ的消息推送闽寡,好幾條消息推送過(guò)來(lái)默認(rèn)模式點(diǎn)擊每條消息都會(huì)創(chuàng)建一個(gè)新的聊天界面的activity,設(shè)置singleTop之類可以保證聊天界面僅維持一個(gè)實(shí)例尼酿。
-------以上兩個(gè)模式被官方歸類為Normal爷狈,下面兩個(gè)屬于Special-------
3)SingleTask:
相對(duì)于singleTop,調(diào)用startActivity()時(shí)不只會(huì)檢查棧頂裳擎,而是遍歷整個(gè)棧淆院。也是啟動(dòng)啟動(dòng)onNewIntent()保證整個(gè)棧中都只有activity對(duì)應(yīng)的一個(gè)實(shí)例。所以叫single task句惯。
比如上圖任務(wù)棧,標(biāo)志為“SingleTask”的Activity2被再次啟動(dòng)時(shí)支救,棧頂會(huì)退到Activity2抢野,Activity3是被終止還是推到后臺(tái)運(yùn)行,要根據(jù)后面說(shuō)的intent flag設(shè)置確定吧(這個(gè)我也不太清楚)各墨。
4)SingleInstance:
類似SingleTask指孤,只是會(huì)新開(kāi)一個(gè)新棧來(lái)存放該activity的實(shí)例,且只有一個(gè)實(shí)例贬堵。(所以這個(gè)模式到底有什么意義恃轩,哦減少遍歷時(shí)間?求大牛講解)
*設(shè)置Launch Mode啟動(dòng)模式有兩種方法:
1)像上面說(shuō)的在AndroidManifest.xml中設(shè)置"standard"|"singleTop"|"singleTask"|"singleInstance"設(shè)置四種參數(shù)黎做;
2)使用intent flag叉跛。就是在Intent中定義flag,然后調(diào)用startActivity()蒸殿。
flag居然不是對(duì)應(yīng)的四種模式筷厘,而只有三種鸣峭!分別是:
FLAG_ACTIVITY_NEW_TASK:如果activity的實(shí)例存在,就調(diào)用onNewIntent()從后臺(tái)調(diào)到前臺(tái)酥艳,如前面所說(shuō)的singleTask摊溶。
FLAG_ACTIVITY_SINGLE_TOP:不用說(shuō)了,如前面的singleTop充石。
FLAG_ACTIVITY_CLEAR_TOP:如果activity的實(shí)例存在莫换,就調(diào)用onNewIntent()從后臺(tái)調(diào)到前臺(tái),但是在這前面的activity的實(shí)例都會(huì)被銷毀(onDestroy())