Activity有四種啟動模式:Standard、SingleTop猎醇、SingleTask账阻、SingleInstance.
Standard - 標(biāo)準(zhǔn)模式
默認(rèn)的系統(tǒng)模式符相。每次啟動一個Activity都會重新創(chuàng)建一個新的實例熔任。這種模式下褒链,誰啟動了該模式的Activity,這個Activity就存在于啟動他的Activity的任務(wù)棧中疑苔。
SingleTop - 棧頂復(fù)用模式
如果要開啟的Activity在任務(wù)棧的頂部已經(jīng)存在甫匹,就不會創(chuàng)建新的實例,而是調(diào)用Activity的onNewIntent()方法惦费。避免棧頂?shù)腁ctivity被重復(fù)創(chuàng)建兵迅。
如果棧頂或棧中不存在該Activity的實例,則情況同Standard模式薪贫。
SingleTask - 棧內(nèi)復(fù)用模式
Activity只會在任務(wù)棧里面存在一個實例恍箭。如果要激活的Activity,在任務(wù)棧里面已經(jīng)存在瞧省,就不會創(chuàng)建新的Activity扯夭,而是復(fù)用這個已經(jīng)存在的Activity,調(diào)用 onNewIntent() 方法臀突,并且清空這個Activity任務(wù)棧上面所有的Activity勉抓。
這個過程還存在一個任務(wù)棧的匹配,因為這個模式啟動時候学,會在自己需要的任務(wù)棧中尋找實例,這個任務(wù)棧就是通過taskAffinity屬性指定纵散。如果這個任務(wù)棧不存在梳码,則會創(chuàng)建這個任務(wù)棧隐圾。
注:盡管 Activity 在新任務(wù)中啟動,但是用戶按“返回”按鈕仍會返回到前一個 Activity掰茶。
SingleInstance - 全局唯一
該模式具備singleTask模式的所有特性外暇藏,與它的區(qū)別就是,這種模式下的Activity會單獨占用一個Task棧濒蒋,具有全局唯一性盐碱,即整個系統(tǒng)中就這么一個實例,由于棧內(nèi)復(fù)用的特性沪伙,后續(xù)的請求均不會創(chuàng)建新的Activity實例瓮顽,除非這個特殊的任務(wù)棧被銷毀了。以singleInstance模式啟動的Activity在整個系統(tǒng)中是單例的围橡,如果在啟動這樣的Activiyt時暖混,已經(jīng)存在了一個實例,那么會把它所在的任務(wù)調(diào)度到前臺翁授,重用這個實例拣播。
taskAffinity
先介紹一下taskAffinity的屬性。
與 Activity 有著親和關(guān)系的任務(wù)收擦。從概念上講贮配,具有相同親和關(guān)系的 Activity 歸屬同一任務(wù)(從用戶的角度來看,則是歸屬同一“應(yīng)用”)塞赂。 任務(wù)的親和關(guān)系由其根 Activity 的親和關(guān)系確定泪勒。
親和關(guān)系確定兩件事 - Activity 更改到的父項任務(wù)(allowTaskReparenting 屬性)和通過 FLAG_ACTIVITY_NEW_TASK 標(biāo)志啟動 Activity 時將用來容納它的任務(wù)。
每個Activity都有taskAffinity屬性减途,這個屬性指出了它希望進(jìn)入的Task酣藻。如果一個Activity沒有顯式的指明該 Activity的taskAffinity,那么它的這個屬性就等于Application指明的taskAffinity鳍置,如果 Application也沒有指明辽剧,那么該taskAffinity的值就等于包名。而Task也有自己的affinity屬性税产,它的值等于它的根 Activity的taskAffinity的值怕轿。
注意:前方有坑!
Standard模式和SingleTop模式都是在原任務(wù)棧中新建Activity實例辟拷,不會創(chuàng)建新的Task撞羽,即使你指定了taskAffinity屬性。
在singleTop模式下我們需要同時在onCreate() 和 onNewIntent()中處理發(fā)來的intent衫冻,以滿足不同情況诀紊。
使用SingleTask或者FLAG_ACTIVITY_NEW_TASK啟動activity的時候,如果沒有指定taskAffinity隅俘,系統(tǒng)并不會新建一個Task邻奠,而是在當(dāng)前棧的棧頂(通過dumpsys activity activities 命令可以看到)笤喳。只有指定了不同的taskAffinity,才會新建Task碌宴。
使用SingleInstance杀狡,如果沒有指定taskAffinity,系統(tǒng)仍然會新建一個Task(通過dumpsys activity activities 命令可以看到)贰镣,但是呜象,從設(shè)備的最近任務(wù)列表中,卻只能看到一個任務(wù)碑隆,而只有指定了taskAffinity恭陡,才能看到兩個不同的任務(wù)。