Activity棧
android系統(tǒng)使用棧的方式對activity進行管理:
采用后進先出原則赞枕,新訪問的activity放在棧頂宅楞,返回時從棧頂移除activity。棧頂?shù)腶ctivity處于激活狀態(tài),能夠與用戶交互蛤克,其之后的activity處于暫停狀態(tài),但保留了界面組件的當前狀態(tài)夷蚊,返回后又會恢復构挤。
每個activity持有一個屬性taskaffinity(可以在manifest文件中設(shè)置),表示activity之間的相關(guān)性惕鼓,默認activity的taskaffinity為應(yīng)用的包名筋现。
同一個Task下的activity不一定都在一起,中間有可能有其他Task的activity箱歧。
當按“home”鍵后這些任務(wù)會切換到后臺矾飞,點擊桌面對應(yīng)應(yīng)用的icon后,相應(yīng)的任務(wù)又會切換到前臺呀邢。
通過命令行語句:
adb shell dumpsys activity activities
可以查看Activity的相關(guān)信息包括affinity和task
啟動模式之lanchMode
可以在manifest中配置activity的啟動模式lanchMode洒沦,activity支持4中啟動模式:
-
standard
他是默認模式,在該模式下activity可以擁有多個實例价淌,這些實例可以位于一個或多個task中申眼。
比如:
1、在A應(yīng)用中多次啟動standard模式的activity1蝉衣,則會創(chuàng)建多個activity1實例括尸,由于都沒設(shè)置taskaffinity,他們都屬于同一個任務(wù)TaskA病毡。
2濒翻、在B應(yīng)用中啟動A應(yīng)用的activity1,則這個activity1屬于B應(yīng)用的任務(wù)TaskB。 -
singleTop
在該模式下肴焊,同一個task中前联,如果存在該Activity實例,并且在棧頂娶眷,則不再創(chuàng)建新的Activity實例似嗤,而是調(diào)用其onNewIntent()方法,否則則創(chuàng)建新的activity實例届宠。 -
singleTask
表示只容許有一個包含該Activity實例的task存在烁落。
比如ActivityB的啟動模式為singleTask:
1、如果activityA和B的taskAffinity一樣豌注,第一次創(chuàng)建ActivityB伤塌,會創(chuàng)建一個新的ActivityB實例,并且屬于同一個Task中轧铁。如果存在ActivityB每聪,則會刪除其之上的所有Activity,然后跳轉(zhuǎn)到ActivityB齿风。
2药薯、如果activityA和B的taskAffinity不一樣,第一次創(chuàng)建ActivityB救斑,會判斷與B的taskAffinity相關(guān)的Task是否存在童本,不存在則創(chuàng)建新的Task,把ActivityB添加進去脸候,如果存在相關(guān)的Task穷娱,這把ActivityB添加在這個Task中;如果存在ActivityB运沦,則把這個Task中ActivityB之上的Activity都刪除泵额,然后跳轉(zhuǎn)到ActivityB中。 -
singleInstance
即只允許存在唯一一個Activity實例茶袒,并且該Activity所在的Task只能有他一個Activity實例梯刚。與singleTask類似,只能有一個實例薪寓。跳轉(zhuǎn)到singleInstance模式的Activity亡资,如果不存在,則創(chuàng)建一個task,添加activity向叉;如果存在锥腻,則直接跳到這個activity。
啟動模式之flag
當跳轉(zhuǎn)activity時母谎,可以通過設(shè)置intent的flag瘦黑,設(shè)置activity的跳轉(zhuǎn)模式,flag的優(yōu)先級比manifest中配置的lanchMode更高。
常用的4中flag:
FLAG_ACTIVITY_NEW_TASK
在官方文檔中介紹幸斥,他與lanchMode=singleTask相同匹摇,實際上并不完全一樣,需要與FLAG_ACTIVITY_CLEAR_TOP結(jié)合才與singleTask一樣甲葬。單獨使用會有很多奇怪的現(xiàn)象廊勃,達不到我們的預期。
比如:
1经窖、如果跳轉(zhuǎn)的連個ActivityA和B在同一個task中坡垫,F(xiàn)LAG_ACTIVITY_NEW_TASK沒有任何作用,多次用這個flag跳轉(zhuǎn)ActivityB画侣,會創(chuàng)建多個ActivityB實例冰悠。
2、ActivityA和B的taskAffinity不同配乱,跳轉(zhuǎn)到ActivityB溉卓,A和B在不同的task中,當在ActivityB的Task中搬泥,跳轉(zhuǎn)到同個Task中的ActivityC,再要跳轉(zhuǎn)到ActivityB的诵,會沒有任何反應(yīng)。因為ActivityB實例已存在佑钾,但是他所在的task的棧頂是activityC,F(xiàn)LAG_ACTIVITY_NEW_TASK又不會刪除activityB只上的Activity烦粒,所有沒有發(fā)生跳轉(zhuǎn)休溶。FLAG_ACTIVITY_SINGLE_TOP
他與lancheMode=singleTop具有想用的的行為。FLAG_ACTIVITY_CLEAR_TOP
清除activity所在task中扰她,位于該activity之上的所有activity兽掰,如果activity的啟動模式是默認的,則該activity會finished掉徒役,再啟動一個新的activity孽尽;如果不想重新創(chuàng)建一個activity,則要再加上FLAG_ACTIVITY_SINGLE_TOP忧勿。FLAG_ACTIVITY_CLEAR_TASK
清除已存在Activity所在task中的所有activity,activity將變成一個空棧中新的最底端的activity需要與FLAG_ACTIVITY_NEW_TASK聯(lián)合起來才能使用杉女,不然沒有效果。