一個(gè)App啟動(dòng)時(shí),如果當(dāng)前環(huán)境不存在改App的任務(wù)棧,系統(tǒng)就會(huì)創(chuàng)建一個(gè)新的任務(wù)棧。這個(gè)棧也被叫做Task。
一個(gè)Task中的Activity可以來自不同的App,通一個(gè)App鐘的Activity也可能不在一個(gè)Task。
正常模式下的棧就是后進(jìn)先出,這里不在介紹。
下面要介紹的是“特權(quán)”模式下的情形:
1、AndroidManifest.xml啟動(dòng)模式
此模式是通過android:launchMode進(jìn)行設(shè)置的,有四種standard、singleTop、singleTask、singleInstance。
standard:默認(rèn),每次啟動(dòng)重新創(chuàng)建,so easy。
singleTop:棧頂存在則不創(chuàng)建,試用于刷新界面的操作。第二次啟動(dòng)會(huì)調(diào)用onNewIntent方法。
singleTask:
(1)在同一個(gè)App中啟動(dòng)singleTask的Activity,將該Activity置于棧頂,它上面的全部銷毀。
(2)其他App以singleTask模式啟動(dòng)這個(gè)Activity,創(chuàng)建一個(gè)新的任務(wù)棧。如果啟動(dòng)模式為singleTask的Activity已經(jīng)在一個(gè)任務(wù)棧中,那么啟動(dòng)后,后臺(tái)的這個(gè)任務(wù)棧將一起唄切換到前臺(tái)。
Back stack:Activity2-Activity1
Background task:ActivityY-ActivityX
Activity2 startActivity(ActivityY):ActivityY-ActivityX-Activity2-Activity1?
SingleTask:多個(gè)應(yīng)用共享Activity的一個(gè)實(shí)例,該任務(wù)棧中只存在這一個(gè)Activity。
注意:在一個(gè)singleTop或者singleInstance的ActivityA中通過startActivityForResult啟動(dòng)里一個(gè)ActivityB,系統(tǒng)會(huì)直接返回Activity.RESULT_CANCELED,而不會(huì)再去等待返回。因?yàn)椴煌腡ask之間是不能傳遞數(shù)據(jù)的,如果一低要傳遞,只能通過Intent綁定數(shù)據(jù)。
2、Intent Flag啟動(dòng)模式
Intent.FLAG_ACTIVITY_NEW_TASK:
使用一個(gè)新的Task來啟動(dòng)Activity,常使用在Service中啟動(dòng)Activity的場景,因?yàn)镾ervice中不存在Activity的棧。
FLAG_ACTIVITY_SINGLE_TOP:
與Android:launchMode="sibgleTop"效果相同。
FLAG_ACTIVITY_CLEAR_TOP:
使用singleTask模式來啟動(dòng)一個(gè)Activity,與launchMode="sibgleTask"效果相同。
FLAG_ACTIVITY_NO_HISTORY:
使用該方式啟動(dòng)的ActivityA,當(dāng)ActivityA再啟動(dòng)其它Activity之后,ActivityA不會(huì)保留在棧中。
清空任務(wù)棧:
clearTaskOnLaunch:每次返回該Activity的時(shí)候都將該Activity智商的所有Activity清除。
finishOnTaskLaunch:當(dāng)離開這個(gè)Activity所處的Task,當(dāng)用戶再返回的時(shí)候該Activity就會(huì)被finish。
alwaysRetainTaskState:給Task一個(gè)免死金牌,該Activity所在的棧不接受任何清理命令,一直保持當(dāng)前Task的狀態(tài)。