Activity四種啟動模式:
1.standard:標(biāo)準(zhǔn)模式(默認模式):啟動一次創(chuàng)建一次實例惭缰,如果啟動activity的Context不是ActivityContext會報錯,standard模式創(chuàng)建任務(wù)棧為包名,非ActivityContext沒有任務(wù)棧名字。解決:1.用ActivityContext筏餐;2.指定Flag為Flag_Activity_new_Task,重新開一個任務(wù)棧牡拇。
2.singleTop:棧頂復(fù)用魁瞪,如果已經(jīng)為棧頂復(fù)用只調(diào)OnNewIntent()。onCreate()等不調(diào)用惠呼,不在棧頂导俘,重新創(chuàng)建。
3.singleTask:棧內(nèi)復(fù)用剔蹋,單實例模式旅薄,如果在它需要的棧內(nèi)有實例,直接調(diào)用泣崩,走onNewIntent()少梁,將其置為top且清掉原來在它之上的activity。場景1.任務(wù)棧T1內(nèi)有Activity ABC矫付,D需要任務(wù)棧T2凯沪,那么會創(chuàng)建T2并把D壓入。場景2.D需要任務(wù)棧T1买优,則直接在T1內(nèi)創(chuàng)建D妨马,這樣T1內(nèi)就是ABCD。場景3.啟動B杀赢,任務(wù)棧為T1烘跺,此時直接調(diào)用B并清除C,這樣T1內(nèi)就是AB脂崔。
4.singleInstance:加強單實例滤淳,除了擁有singleTask的所有特點以為,它必須單獨在一個任務(wù)棧脱篙,只要它在就不會重新實例娇钱。
TaskAffinity:任務(wù)棧名伤柄,給activity指定任務(wù)棧名后啟動的activity就會在該任務(wù)棧存在绊困,任務(wù)棧名為字符串且必須包含“.”。
allowTaskReparenting:屬性值為Boolean适刀,是否允許任務(wù)棧轉(zhuǎn)移秤朗。
啟動模式兩種方法:顯示和隱式。
1.顯式:java類實現(xiàn)笔喉,優(yōu)先級高取视,但不能指定singleInstance模式硝皂。
2.隱式:xml文件定義,不能指定Flag
Flag:
1.FLAG_ACTIVITY_NEW_TASK:singTask模式作谭。
2.FLAG_ACTIVITY_SINGLE_TOP:singTop模式稽物。
3.FLAG_ACTIVITY_CLEAR_TOP:與singleTask一塊用,清掉它之上的所有折欠。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不再歷史列表顯示贝或。可在xml文件內(nèi)指定該屬性為true锐秦。
舉例1.前臺任務(wù)棧內(nèi)AB咪奖,后臺任務(wù)棧CD,啟動D酱床,此時整個后退列表為ABCD羊赵;如果啟動C,則后退列表為ABC扇谣,D被清掉昧捷。
舉例2.standard模式A,singleTask模式BC且指定任務(wù)棧T2罐寨,順序ABCAB料身。默認任務(wù)棧內(nèi)A,T2內(nèi)BC衩茸,此時C啟動A芹血,A會進入到T2,此時T2內(nèi)為BCA楞慈,A再啟動B幔烛,則CA會被清掉,這樣默認任務(wù)棧內(nèi)為A囊蓝,T2內(nèi)為B饿悬。點擊一次后退,B被清掉聚霜,后臺任務(wù)棧A顯示狡恬,再后退一次,回到桌面蝎宇。
舉例3.taskAffinity+allowTaskReparenting弟劲,應(yīng)用A啟動應(yīng)用B中Activity C,如果C需要任務(wù)棧轉(zhuǎn)移姥芥,B啟動后C直接從A的任務(wù)棧轉(zhuǎn)移到B兔乞。