久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【Android】任務(wù)和返回棧(task and back stack)

 James130 2017-02-25
    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í),,該apptask會(huì)被移到前臺(tái)顯示。如果當(dāng)前沒有該apptask,,系統(tǒng)將會(huì)新建一個(gè)task并在其中運(yùn)行Main activity,。

    一個(gè)activityA)打開另一個(gè)activityB),B將會(huì)被置于棧頂并顯示,,A仍然處于棧中,,系統(tǒng)會(huì)保存它的狀態(tài)。 如果按下返回鍵,,當(dāng)前的activity將被彈出棧并destroy掉,,前一個(gè)activityresume并重新顯示(還原stop前的UI顯示)。

    下圖表示2個(gè)activity切換過程該棧的狀態(tài),。


    用戶可通過BACK鍵讓task棧中的activity依次彈出,,當(dāng)最后一個(gè)activity也被彈出后,該task便不再存在,。

    如果HOME鍵被按下,,從當(dāng)前app回到桌面,該appTask會(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é)Activitytask的默認(rèn)行為:

  • Activity A 啟動(dòng)了 Activity B ,, A 會(huì)被 stop ,,但狀態(tài)仍然保存( UI ,如活動(dòng)條的位置,, EditText 輸入的文字),,從 B 返回,, A resumed 并恢復(fù)之前的狀態(tài)。
  • 點(diǎn)擊HOME鍵返回桌面,,當(dāng)前的task被移到后臺(tái),,系統(tǒng)會(huì)保存task中每一個(gè)activity的狀態(tài);直到用戶點(diǎn)擊 app 圖標(biāo)返回,,該task被移回前臺(tái),,resume棧頂?shù)?/span>activity
  • BACK鍵會(huì)導(dǎo)致當(dāng)前的activity從棧頂彈出并被destroy ,,該activity狀態(tài)不會(huì)再被保存,,前一個(gè)activity移到棧頂。
  • Activity能被實(shí)例化多次,,包括其它task啟動(dòng)它,。

管理Task

       Android管理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)屬性:

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

 

Intent 也有相關(guān)的flag:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

     android建議一般的app都不要干涉系統(tǒng)按照默認(rèn)的方式管理activity和task。如果coder必須指定非默認(rèn)的管理的方式,,最好確定這種效果能符合用戶的預(yù)期,。

定義Launch Mode

對(duì)<activity> 的launchMode可以指定以下值:

Use Cases Launch Mode
Multiple Instances?
Comments
Normal launches for most activities
"standard"
Yes

默認(rèn)行為。每次啟動(dòng)一個(gè)activity,,系統(tǒng)都會(huì)在當(dāng)前task新建一個(gè)實(shí)例,。

Normal launches for most activities
"singleTop"
Conditionally

如果要啟動(dòng)的activity已經(jīng)存在于棧頂,則會(huì)將intent傳遞給該activity的onNewIntent()方法,。注意,,不會(huì)創(chuàng)建新的activity實(shí)例對(duì)象。

如果棧頂不是要啟動(dòng)的activity,,則會(huì)創(chuàng)建該activity的新實(shí)例,,即singleTop只檢查棧頂元素,這樣棧中可能包含多個(gè)該activity的實(shí)例對(duì)象,。

Specialized launches
(not recommended for general use)
"singleTask"
No

系統(tǒng)會(huì)創(chuàng)建一個(gè)新的任務(wù)(task)并將目標(biāo)activity作為這個(gè)任務(wù)的根元素,。

注意,如果目標(biāo)對(duì)象已經(jīng)存在于一個(gè)獨(dú)立的棧中,,系統(tǒng)會(huì)將intent對(duì)象轉(zhuǎn)發(fā)(route)到目標(biāo)activity的onNewIntent()方法中,,而不會(huì)新建任務(wù)。

注意,這個(gè)情況在notification中是很有用的,。

Specialized launches
(not recommended for general use)
"singleInstance"
No

和"singleTask"類似,,為目標(biāo)activity新建一個(gè)task,且該task中不會(huì)再存放其它activity,,只存放目標(biāo)activity一個(gè),。

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)用,。

 

Affinity

affinity用于指定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ā)生作用:

  • 使用FLAG_ACTIVITY_NEW_TASK啟動(dòng)一個(gè)activity,。如果該activity指定了taskAffinity,,系統(tǒng)會(huì)將 activity實(shí)例置于指定的task中。 注意的是,,此情況下如果用戶點(diǎn)擊HOME鍵,,必須要確定有辦法能回到那個(gè)task中!(例如task所屬的app在launcher有自己icon)
  • activity 設(shè)置了 allowTaskReparenting = “true”,。 當(dāng)activity所在的task被移到前臺(tái)時(shí),,該activity會(huì)被移動(dòng)到affinity指定的task中。

清理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ì)生效,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多