Android學(xué)習(xí)筆記1-Activity的Lifecycle和Launch Mode

(本文同步在個(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)的改變)

Activity Lifecycle

明白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í)例。

Activity Task Stack

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。

SingleTask Stack

比如上圖任務(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())

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容