Task是指將相關(guān)的Activity按照先進(jìn)后出的規(guī)則組合到一起,,以Activity
Stack的方式進(jìn)行管理,。從用戶體驗(yàn)上講,一個(gè)“應(yīng)用程序”就是一個(gè)Task,,但是從根本上講,,一個(gè)Task可以由一個(gè)或多個(gè)Android
Application組成的。例如:你想在發(fā)送短信時(shí),,拍一張照并作為彩信發(fā)出去,,這時(shí)你首先停留在短信應(yīng)用程序的的Acitivity上,,然后跳轉(zhuǎn)到
Camera應(yīng)用程序的Activity上,當(dāng)完成拍照功能后,,再返回到短信應(yīng)用程序的Activity,。這實(shí)際上是兩個(gè)Android
Application協(xié)同合作后完成的工作,但為了更好的用戶體驗(yàn),,Android平臺(tái)加入了Task這么一種機(jī)制,,讓用戶沒有感覺到應(yīng)用的中斷,讓用戶感覺在一“應(yīng)用程序”里就完成了想完成的工作,。
用戶點(diǎn)擊圖標(biāo)打開一個(gè)app時(shí),,該app的task會(huì)被移到前臺(tái)顯示。如果當(dāng)前沒有該app的task,,系統(tǒng)將會(huì)新建一個(gè)task并在其中運(yùn)行Main activity,。 一個(gè)activity(A)打開另一個(gè)activity(B),B將會(huì)被置于棧頂并顯示,,A仍然處于棧中,,系統(tǒng)會(huì)保存它的狀態(tài)。 如果按下返回鍵,,當(dāng)前的activity將被彈出棧并destroy掉,,前一個(gè)activity被resume并重新顯示(還原stop前的UI顯示)。 下圖表示2個(gè)activity切換過程該棧的狀態(tài),。 用戶可通過BACK鍵讓task棧中的activity依次彈出,,當(dāng)最后一個(gè)activity也被彈出后,該task便不再存在,。
如果HOME鍵被按下,,從當(dāng)前app回到桌面,該app的Task會(huì)被移到后臺(tái),,后臺(tái)的task所屬的所有activity都是stop狀態(tài),,且back stack依然存在——這個(gè)task其實(shí)只是失去了和用戶交互的焦點(diǎn)。
多個(gè)task可以同時(shí)存在后臺(tái),,但是系統(tǒng)也會(huì)停止一些activity來釋放空間,導(dǎo)致activity的狀態(tài)丟失,。
Back stack中的activity不會(huì)被重新排位,,如果同一個(gè)activity能被其他多個(gè)activity 啟動(dòng),這個(gè)activity都會(huì)創(chuàng)建新實(shí)例推入棧中:
總結(jié)Activity和task的默認(rèn)行為:
管理TaskAndroid管理task和back stack的默認(rèn)行為:activity在同一個(gè)任務(wù)中創(chuàng)建并置于先進(jìn)后出的棧中。如果這種默認(rèn)的行為不能滿足我們的app設(shè)計(jì),,如:為一個(gè)activity創(chuàng)建一個(gè)新任務(wù)(而不是在相同的任務(wù) 中),,或者啟動(dòng)activity時(shí)直接打開已存在的實(shí)例(而不是直接在棧頂創(chuàng)建新實(shí)例),又或者在用戶離開這個(gè)task的時(shí)候清空除了棧頂以外的全部 activity,。Android提供了一些屬性和flag讓coder來指定管理的方式,。 在manifest <activity>標(biāo)簽中的相關(guān)屬性: Intent 也有相關(guān)的flag: android建議一般的app都不要干涉系統(tǒng)按照默認(rèn)的方式管理activity和task。如果coder必須指定非默認(rèn)的管理的方式,,最好確定這種效果能符合用戶的預(yù)期,。 定義Launch Mode對(duì)<activity> 的launchMode可以指定以下值:
SingleTask的例子:瀏覽器的browser activity設(shè)置了SingleTask只運(yùn)行在它自己的task中,如果Browser的task現(xiàn)在正在后臺(tái)當(dāng)中(task B),,而我們的app(task A)的正要打開這個(gè)activity,,這個(gè)task就會(huì)被直接移到前臺(tái)接收我們的intent。 返回鍵只會(huì)將界面返回到當(dāng)前task的下一個(gè)activity,,所以Task B回到前臺(tái)后,,返回鍵會(huì)先作用在Task B中,直到最后一個(gè)activity被彈出,,才會(huì)回到我們的Task A棧頂?shù)腶ctivity,。
注意:launchMode能被Intent 的flag覆蓋。
使用Intent 標(biāo)志FLAG_ACTIVITY_NEW_TASK: 等同于 singleTask FLAG_ACTIVITY_SINGLE_TOP: 等同singleTop FLAG_ACTIVITY_CLEAR_TOP: 如果該activity已經(jīng)運(yùn)行在當(dāng)前task中,,intent指定啟動(dòng)這個(gè)activity時(shí),,task中在它上面的activity都會(huì)被destroy,直到指定的activity位于棧頂,,然后它的onNewIntent()被調(diào)用,。
Affinityaffinity用于指定activity所屬的task。默認(rèn)狀態(tài)下,,一個(gè)app中的所有activity都有相同的affinity,,所以它們會(huì)運(yùn)行 在同一個(gè)task。而通過<activity>的taskAffinity屬性可以指定affinity,。 taskAffinity要用<manifest>中定義的唯一包名來取值,,系統(tǒng)通過包名定位到app的默認(rèn)task。 taskAffinity在以下2種情況中發(fā)生作用:
清理back stack如果用戶離開一個(gè)task很長(zhǎng)時(shí)間,,系統(tǒng)會(huì)清理?xiàng)m斠韵碌腶ctivity,這樣task被從新打開時(shí),棧頂activity就被還原了,。coder同樣可以通過<activity>屬性改變這種行為: alwaysRetatinTaskState: 如果當(dāng)前棧頂?shù)腶ctivity設(shè)置此屬性為true,,task中的所有activity都會(huì)被保留狀態(tài)。 clearTaskOnLaunch:如果當(dāng)前棧頂?shù)腶ctivity設(shè)置此屬性為true,,行為則與alwaysRetatinTaskState相反,,每次離開并重新該task,棧頂下的所有activity都會(huì)被清除,,用戶返回task時(shí)永遠(yuǎn)都是activity初始化的狀態(tài),。 finishOnTaskLaunch: 與clearTaskOnLaunch 相似,不過只作用于單個(gè)activity,,不影響整個(gè)task,。即使是棧頂?shù)腶ctivity,也會(huì)生效,。 |
|