### 1.2 Activity的啟動模式
在默認情況下,當我們多次啟動同一個Activity 的時候,系統會創建多個實例并把官們一一放入任務棧中, 當我們單擊back 鍵,會發現這些Activity 會一一回退。任務棧是一種“后進先出”的棧結構,這個比較好理解,每按一下back 鍵就會有一個Activity 出棧,直到棧空為止,當棧中無任何Activity的時候,系統就會回收這個任務棧。
目前有四種啟動模式: standard 、singleTop 、singleTask 和singlelnstance
關于任務棧的詳細描述,可參考這里[Android中關于任務棧的總結](http://www.hmoore.net/alex_wsc/android/433739)
#### 1.2.1 Activity的LaunchMode
1. standard:標準模式
每次啟動都會重新創建一個實例,不管這個Activity在棧中是否已經存在。誰啟動了這個Activity,那么Activity就運行在啟動它的那個Activity所在的棧中。
用Application去啟動Activity時會報錯,原因是非Activity類型的Context沒有任務棧。解決辦法是為待啟動Activity制定FLAG_ACTIVITY_NEW_TASH標志位,這樣就會為它創建一個新的任務棧。
2. singleTop:棧頂復用模式
如果新Activity位于任務棧的棧頂,那么此Activity不會被重新創建,同時回調 onNewIntent 方法。onCreate和onStart方法不會被執行。
如果新的Activity實例已經存在,但是不位于棧頂,則新Activity仍然會被重新創建。
3. singleTask:棧內復用模式
這是一種單實例模式。只要activity在一個棧中存在,則多次啟動此Activity都不會重新創建實例;具體而言,當一個具有singleTask模式的Activity請求啟動后,比如Activity A,系統會首先尋找是否存在A想要的任務棧,如果不存在activity所需要的任務棧,則創建一個新任務棧和新Activity實例;如果存在所需要的任務棧,不存在實例,則新創建一個Activity實例,并把它壓入棧中;如果存在所需要的任務棧和實例,則不創建,調用onNewIntent方法,同時使該Activity實例之上的所有Activity出棧。
4. singleIntance
單實例模式。具有singleTask模式的所有特性,同時具有此模式的Activity只能獨自位于一個任務棧中。換句話說,比如Activity A 是singlelnstance 模式, 當A 啟動后,系統會為它創
建一個新的任務棧,然后A 獨自在這個新的任務棧中,由于棧內復用的特性,后續的請求
均不會創建新的Activity,除非這個獨特的任務錢被系統銷毀了。
**什么是Activity 所需要的任務棧呢?**
在singleTask 啟動模式中,多次提到某個Activity所需的任務棧,什么是Activity 所需要的任務棧呢?這要從一個參數說起: TaskAffInity,可以翻譯為任務相關性。這個參數標識了一個Activity所需要的任務棧的名字,默認情況下,所有Activity所需的任務棧的名字為應用的包名。當然,我們可以為每個Activity 都單獨指定TaskAffinity屬性,這個屬性值必須不能和包名相同,否則就相當于沒有指定。TaskAffinity 屬性主要和singleTask 啟動模式或者allowTaskReparenting 屬性配對使用,在其他情況下沒有意義。另外,任務棧分為前臺任務棧和后臺任務棧,后臺任務棧中的Activity位于暫停狀態,用戶可以通過切換將后臺任務棧再次調到前臺。
**設置啟動模式**
1. manifest中 設置下的 android:launchMode 屬性。
2. 啟動Activity的 `intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);` 。
兩種同時存在時,第二種的優先級高于第一種,以第二種為準。其次,在限定范圍上有所不同,第一種方式無法直接為Activity添加FLAG_ACTIVITY_CLEAR_TOP標識,第二種方式無法指定singleInstance模式。
可以通過命令行 adb shell dumpsys activity 命令查看棧中的Activity信息。
#### 1.2.2 Activity的Flags
這些FLAG可以設定啟動模式、可以影響Activity的運行狀態。
* FLAG_ACTIVITY_NEW_TASK
為Activity指定“singleTask”啟動模式。
* FLAG_ACTIVITY_SINGLE_TOP
為Activity指定“singleTop"啟動模式。
* FLAG_ACTIVITY_CLEAR_TOP
具有此標記位的Activity啟動時,同一個任務棧中位于它上面的Activity都要出棧,一般和FLAG_ACTIVITY_NEW_TASK配合使用。
* FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果設置,新的Activity不會在最近啟動的Activity的列表(就是安卓手機里顯示最近打開的Activity那個系統級的UI)中保存。等同于在xml中指定android:exludeFromRecents="true"屬性。
>[info] 注意:Flags并不能簡單地等同于啟動模式
- 前言
- 第一章Activity的生命周期和啟動模式
- 1.1 Activity生命周期全面分析
- 1.2 Activity的啟動模式
- 1.3 IntentFilter的匹配規則
- 第二章IPC
- 轉 chapter IPC
- 轉IPC1
- 轉IPC2
- Binder講解
- binder
- Messenger
- 一、Android IPC簡介
- 二、Android中的多進程模式
- 三、IPC基礎概念介紹
- 四、Android中的IPC方式
- 五、Binder連接池
- 第三章
- 第九章四大組件的工作過程
- 第十章
- 第13章 綜合技術
- 使用CrashHandler 來獲取應用的crash 信息
- 使用Multidex來解決方法數越界
- Android的動態加載技術