在默認情況下颂斜,當我們多次啟動同一個Activity的時候鬼悠,系統(tǒng)會創(chuàng)建多個實例并把它們放入任務棧中,當我們單擊back鍵時江滨,這些Activity會一一回退。任務棧是一種"后進先出"的棧結構厌均,每一次back就會有一個Activity出棧牙寞,直到棧空為止莫秆,當棧中無任何Activity的時候间雀,系統(tǒng)就會回收這個任務棧。
1.standard:標準模式(系統(tǒng)默認模式)镊屎,每次啟動一個Activity都會重新創(chuàng)建一個實例惹挟,不管這個實例是否已經(jīng)存在。一個任務棧中可以有多個實例缝驳,每個實例也可以屬于不同的任務棧连锯。當我們用ApplicationContext啟動一個standard模式的Activity归苍,會報AndroidRuntimeException錯誤,因為standard模式的Activity默認會進入啟動它的Activity所屬的任務棧中运怖,但由于非Activity的Context并沒有所謂的任務棧拼弃,所以報錯。解決方案添加FLAG_ACTIVITY_NEW_TASK標記位摇展,為它創(chuàng)建一個新的任務棧吻氧,實際上是以singleTask模式啟動的。
2.singleTop:棧頂復用模式咏连,如果新的Activity已經(jīng)位于任務棧的棧頂盯孙,那么此Activity不會被重新創(chuàng)建。它的onNewIntent方法會被回調祟滴,但不會調用onCreate振惰,onStart。如果新的Activity的實例已經(jīng)存在但不是位于棧頂垄懂,那么新的Activity仍然會被創(chuàng)建骑晶。
3.singleTask:棧內(nèi)復用模式,這是一種單實例模式草慧,只要Activity在一個棧中存在透罢,那么多次啟動此Activity都不會重新創(chuàng)建實例,它的onNewIntent方法會被回調冠蒋。singleTask默認具有clearTop的效果羽圃,會導致棧內(nèi)所有在此實例之上的Activity全部出棧。
4.singleInstance:單實例模式抖剿,這是一種加強的singleTask模式朽寞,它除了具有singleTask模式的所有特性外,還加強了一點斩郎,就是具有此種模式的Activity脑融,系統(tǒng)會為它創(chuàng)建一個新的任務棧,然后獨自在這個任務棧中缩宜。