Activity的啓動模式
1.1 Activity的LaunchMode
1.1.1爲什麼需要啓動模式
因爲Activity的使用任務棧進行對Activity實例控制,任務棧是一種先進後出的棧結構。如果我們多次啓動同一個Activity,系統會重複創建多個實例,這樣子就會導致某些場景下,應用的界面跳轉不合用戶的期望。例如:用戶一般希望回到主界面時,再次點擊back鍵後,就是表示真正的退出應用。但是如果是棧形式的每次啓動一個Activity就會創建一個實例的一個控制方式,那麼就實現不了這個結果。所以,Android設計了啓動模式來修改系統的默認行爲。
1.1.2啓動模式種類
- standard:標準模式。系統默認的模式。每一次啓動Activity都會重新創建一個新的實例,不管這個實例是否已經存在。
- singleTop:棧頂複用模式。如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時它的onNewIntent方法會被調用。
- singleTask:棧內複用模式。也會回調其onNewIntent方法。singleTask默認具有clearTop的效果,會導致棧內在該實例前面的所有實例都會被出棧。(生命週期爲:onPause->onNewIntent->onResume)
- singleInstance:單實例模式。這種Activity只能單獨地位於一個任務棧中。比如:Activity A是singleInstance模式,當A啓動後,系統會爲它創建一個新的任務棧,然後A獨自在這個新的任務棧中,由於棧內複用特性,後續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷燬了。
1.1.3Activity的Flags
- FLAG_ACTIVITY_NEW_TASK
該標記位的作用與singleTask啓動模式意義一樣。 - FLAG_ACTIVITY_SINGLE_TOP
該標記位的作用與singleTop啓動模式意義一樣。 - FLAG_ACTIVITY_CLEAR_TOP
具有該標記位的Activity,當它啓動時,在同一個任務棧中所有位於它上面的Activity都要出棧。
這個模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用,在這種情況下,被啓動Activity的實例如果存在,那麼系統就會調用它的onNewIntent。
如果被啓動的Activity採用standard模式啓動,那麼它連同它之上的Activity都要出棧,系統會創建新的Activity實例並放入棧頂。 - FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有這個標記的Activity不會出現在歷史Activity的列表中,當某些情況下,我們不希望用戶通過歷史列表回到我們的和Activity時,就可以使用該標記。他等同於在XML中指定Activity的屬性android:excludeFromRecents="true"