通過(guò)Acitivty的xml標(biāo)簽來(lái)改變?nèi)蝿?wù)棧的默認(rèn)行為
- 使用android:launchMode="standard|singleInstance|singleTask|singleTop"
來(lái)控制Acivity任務(wù)棧挣柬。
任務(wù)棧是一種后進(jìn)先出的結(jié)構(gòu)盖奈。位于棧頂?shù)腁ctivity處于焦點(diǎn)狀態(tài),當(dāng)按下back按鈕的時(shí)候,棧內(nèi)的Activity會(huì)一個(gè)一個(gè)的出棧,并且調(diào)用其onDestory()方法。如果棧內(nèi)沒(méi)有Activity,那么系統(tǒng)就會(huì)回收這個(gè)棧,每個(gè)APP默認(rèn)只有一個(gè)棧,以APP的包名來(lái)命名.
standard:標(biāo)準(zhǔn)模式铅歼。每次啟動(dòng)一個(gè)Activity就會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例,并將其壓入任務(wù)棧的棧頂,而不管這個(gè)Activity是否已經(jīng)存在。Activity的啟動(dòng)三回調(diào)(onCreate()->onStart()->onResume())都會(huì)執(zhí)行贮预。
singleTop:棧頂復(fù)用模式。這種模式下契讲,如果新的Activity已經(jīng)在任務(wù)棧的棧頂仿吞,那么此Activity不會(huì)被重新創(chuàng)建,而Activity的啟動(dòng)三回調(diào)就不會(huì)被執(zhí)行怀泊,同時(shí)Activity的onNewIntent()方法會(huì)被回調(diào)茫藏。如果Activity存在但不在棧頂误趴,那么會(huì)像standard模式一樣霹琼。
singleTask:棧內(nèi)復(fù)用模式。創(chuàng)建這樣的Activity的時(shí)候,系統(tǒng)會(huì)先確定它所需要的任務(wù)棧已經(jīng)創(chuàng)建枣申,否則先創(chuàng)建任務(wù)棧售葡,然后放入Activity,如果棧中已經(jīng)有這個(gè)Activity實(shí)例忠藤,那么這個(gè)Activity會(huì)被調(diào)到棧頂挟伙。onNewIntent(),并且會(huì)清理在當(dāng)前Activity上面的所有Activity(clear top)模孩。
singleInstance:加強(qiáng)版的singleTask模式尖阔,這種模式的Activity只能獨(dú)立于一個(gè)任務(wù)棧內(nèi),由于棧內(nèi)復(fù)用特性榨咐,后續(xù)請(qǐng)求都不會(huì)創(chuàng)建新的Activity介却,除非這個(gè)任務(wù)棧被系統(tǒng)銷(xiāo)毀了
使用場(chǎng)景:
singleTop適合接收通知啟動(dòng)的內(nèi)容顯示頁(yè)面。
例如块茁,某個(gè)新聞客戶(hù)端的新聞內(nèi)容頁(yè)面齿坷,如果收到10個(gè)新聞推送,每次都打開(kāi)一個(gè)新聞內(nèi)容頁(yè)面是很煩人的数焊。singleTask適合作為程序入口點(diǎn)永淌。
例如瀏覽器的主界面。不管從多少個(gè)應(yīng)用啟動(dòng)瀏覽器佩耳,只會(huì)啟動(dòng)主界面一次遂蛀,其余情況都會(huì)走onNewIntent,并且會(huì)清空主界面上面的其他頁(yè)面干厚。singleInstance應(yīng)用場(chǎng)景:
鬧鈴的響鈴界面答恶。 你以前設(shè)置了一個(gè)鬧鈴:上午6點(diǎn)。在上午5點(diǎn)58分萍诱,你啟動(dòng)了鬧鈴設(shè)置界面悬嗓,并按 Home 鍵回桌面;在上午5點(diǎn)59分時(shí)裕坊,你在微信和朋友聊天包竹;在6點(diǎn)時(shí),鬧鈴響了籍凝,并且彈出了一個(gè)對(duì)話(huà)框形式的 Activity(名為 AlarmAlertActivity) 提示你到6點(diǎn)了(這個(gè) Activity 就是以 SingleInstance 加載模式打開(kāi)的)周瞎,你按返回鍵,回到的是微信的聊天界面饵蒂,這是因?yàn)?AlarmAlertActivity 所在的 Task 的棧只有他一個(gè)元素声诸, 因此退出之后這個(gè) Task 的棧空了退盯。如果是以 SingleTask 打開(kāi) AlarmAlertActivity彼乌,那么當(dāng)鬧鈴響了的時(shí)候泻肯,按返回鍵應(yīng)該進(jìn)入鬧鈴設(shè)置界面。