前言
singleTop
與singleTask
是Activity最常用的兩種啟動(dòng)模式。本文主要講解兩者之間的區(qū)別與使用場(chǎng)景琐凭。
推薦
個(gè)人博客:李益的小站
Activity的四種啟動(dòng)模式
Activity共有四種啟動(dòng)模式葛家,我們先簡(jiǎn)單回顧一下,如想要詳細(xì)了解的计盒,可自行網(wǎng)上查詢(相關(guān)文章很多哦仁期,本文就不再詳細(xì)贅述)了。
-
standard
標(biāo)準(zhǔn)模式懂盐,也是Activity的默認(rèn)啟動(dòng)模式褥赊,允許存在多個(gè)Activity實(shí)例,每次啟動(dòng)頁(yè)面時(shí)都會(huì)生成一個(gè)新的Activity實(shí)例莉恼。
-
singleTop
相比于
standard
拌喉,有新的頁(yè)面啟動(dòng)請(qǐng)求時(shí),當(dāng)目標(biāo)Activity處于當(dāng)前棧頂時(shí)俐银,會(huì)調(diào)用Activity的onNewIntent()
方法尿背,但不創(chuàng)建新實(shí)例;其他情況都和standard
一致捶惜。 -
singleTask
設(shè)置了
singleTask
為啟動(dòng)模式的Activity田藐,它在啟動(dòng)的時(shí)候,會(huì)先在系統(tǒng)中查找是否存在屬性值affinity
等于它自己的屬性值taskAffinity
的任務(wù)棧存在售躁;如果存在這樣的任務(wù)棧坞淮,它就會(huì)在這個(gè)任務(wù)棧中啟動(dòng),否則就會(huì)在新任務(wù)棧中啟動(dòng)陪捷。因此回窘,如果我們想要設(shè)置了啟動(dòng)模式為singleTask
的Activity在新的任務(wù)棧中啟動(dòng),就要為它設(shè)置一個(gè)獨(dú)立的taskAffinity
屬性值市袖。如果設(shè)置啟動(dòng)模式為singleTask
的Activity不是在新的任務(wù)棧中啟動(dòng)啡直,它會(huì)在已有的任務(wù)棧中查看是否已經(jīng)存在相應(yīng)的Activity實(shí)例,如果存在苍碟,就會(huì)把位于這個(gè)Activity實(shí)例上面的其他Activity全部結(jié)束掉酒觅,最終這個(gè)Activity實(shí)例會(huì)位于任務(wù)棧的頂端。 -
singleInstance
和
singleTask
相比微峰,不同點(diǎn)在于singleInstance activity
所在的任務(wù)棧只會(huì)有這一個(gè)Activity
Activity的任務(wù)棧(Task)簡(jiǎn)述
- Application啟動(dòng)時(shí)舷丹,系統(tǒng)會(huì)為Application創(chuàng)建一個(gè)任務(wù)棧(Task)
- 我們對(duì)Activity的打開(kāi)和關(guān)閉操作,就是將Activity壓入(push)任務(wù)棧和從任務(wù)棧中彈出(pop)的操作
- 任務(wù)棧遵循先進(jìn)后出的原則蜓肆,在棧頂?shù)?strong>Activity就是設(shè)備當(dāng)前顯示的Activity
-
singleTask
與singleTop
一般都是為了保證Activity在任務(wù)棧中的唯一性
singleTop的使用
使用singleTop
模式的Activity在棧頂時(shí)只會(huì)在Task中存在一個(gè)實(shí)例颜凯,所以可以在以下場(chǎng)景中使用:
- 要打開(kāi)的Activity處于棧頂,點(diǎn)擊通知欄打開(kāi)棧頂?shù)腁ctivity
- Activity需要啟動(dòng)一個(gè)Service仗扬,最后Service對(duì)棧頂Activity進(jìn)行操作
- 特定情況時(shí)症概,如進(jìn)行數(shù)據(jù)刷新,自己跳轉(zhuǎn)自己早芭,走onNewIntent()刷新數(shù)據(jù)
- 等等......
總之彼城,singleTop
比較適用于ChildActivity(非主架構(gòu)Activity)
singleTask的使用
- 當(dāng)Task中存在Activity實(shí)例,不會(huì)創(chuàng)建Activity,而是銷毀Activity上面所有其他的Activity募壕,以此來(lái)使將要跳轉(zhuǎn)的Activity處于棧頂顯示调炬;如果不存在,則在棧頂創(chuàng)建一個(gè)Activity實(shí)例司抱,
所以假如有人問(wèn)如何快速關(guān)閉100個(gè)Activity筐眷,只要給跳轉(zhuǎn)的Activity設(shè)置singleTask即可
-
Activity單獨(dú)使用
singleTask
,并不會(huì)創(chuàng)建一個(gè)新的Task -
singleTask
的Activity如果設(shè)置了獨(dú)立的taskAffinity
屬性值习柠,啟動(dòng)時(shí)就會(huì)在新的Task中匀谣,否則會(huì)在已有Task中
所以基于以上特性,比較適合主架構(gòu)Activity(例MainActivity)設(shè)置為singleTask
资溃,或者一些經(jīng)常使用武翎,但是關(guān)閉和跳轉(zhuǎn)不規(guī)律的Activity