在默認情況下,當我們多次啟動同一個Activity的時候,系統會創建多個實例并把它們放入任務棧中,當我們單擊back鍵時,這些Activity會一一回退。任務棧是一種"后進先出"的棧結構,每一次back就會有一個Activity出棧,直到棧空為止,當棧中無任何Activity的時候,系統就會回收這個任務棧。
1.standard:標準模式(系統默認模式),每次啟動一個Activity都會重新創建一個實例,不管這個實例是否已經存在。一個任務棧中可以有多個實例,每個實例也可以屬于不同的任務棧。當我們用ApplicationContext啟動一個standard模式的Activity,會報AndroidRuntimeException錯誤,因為standard模式的Activity默認會進入啟動它的Activity所屬的任務棧中,但由于非Activity的Context并沒有所謂的任務棧,所以報錯。解決方案添加FLAG_ACTIVITY_NEW_TASK標記位,為它創建一個新的任務棧,實際上是以singleTask模式啟動的。
2.singleTop:棧頂復用模式,如果新的Activity已經位于任務棧的棧頂,那么此Activity不會被重新創建。它的onNewIntent方法會被回調,但不會調用onCreate,onStart。如果新的Activity的實例已經存在但不是位于棧頂,那么新的Activity仍然會被創建。
3.singleTask:棧內復用模式,這是一種單實例模式,只要Activity在一個棧中存在,那么多次啟動此Activity都不會重新創建實例,它的onNewIntent方法會被回調。singleTask默認具有clearTop的效果,會導致棧內所有在此實例之上的Activity全部出棧。
4.singleInstance:單實例模式,這是一種加強的singleTask模式,它除了具有singleTask模式的所有特性外,還加強了一點,就是具有此種模式的Activity,系統會為它創建一個新的任務棧,然后獨自在這個任務棧中。