【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )
文章目錄
- 一、 singleTask ( 棧內復用模式 ) Activity 實例在返回堆棧中的位置
- 二、 singleTask ( 棧內復用模式 ) Activity 啟動的五種情況
- 三、 singleTask 棧內復用模式 任務棧處理 ( 前臺任務棧 | 后臺任務棧 )
- 四、 singleTask 模式 存在 Activity 實例的任務棧處理
- 五、 FLAG_ACTIVITY_BROUGHT_TO_FRONT 常量解析
- 六、 singleTask 棧內復用模式回退鍵行為
- 七、 singleTask 棧內復用模式 啟動總結
- 八、 singleInstance 單實例模式
一、 singleTask ( 棧內復用模式 ) Activity 實例在返回堆棧中的位置
singleTask 啟動模式的 Activity 只能在任務返回堆棧的最底部 , 即棧底 , 根 Activity 位置 , 其在返回堆棧中 , 該 Activity 實例下面不可能也不能存在任何 Activity 實例 ;
singleTask 啟動模式的 Activity 存在的任務返回堆棧中 , 在根 Activity 上面 , 可以有其它的 Activity 實例 , 該任務返回堆棧可以有多個實例 , 但棧底必須是該 singleTask 啟動模式的 Activity 實例 ;
二、 singleTask ( 棧內復用模式 ) Activity 啟動的五種情況
啟動 singleTask ( 棧內復用模式 ) 的 Activity 界面時 , 首先要處理任務棧 ( 333 種情況 ) , 然后處理任務棧中的實例 ( 222 種情況 ) , 共有五種處理狀況 ;
- 設備當前所有任務棧中沒有 Activity 實例 : 直接創建新的任務 , 創建新的 Activity 實例放入該任務返回堆棧中 ;
- 前臺任務棧有該 Activity 實例 , 并且在棧頂
- 前臺任務棧有該 Activity 實例 , 并且不在棧頂
- 后臺任務棧有該 Activity 實例 , 并且在棧頂
- 后臺任務棧有該 Activity 實例 , 并且不在棧頂
三、 singleTask 棧內復用模式 任務棧處理 ( 前臺任務棧 | 后臺任務棧 )
singleTask 棧內復用模式 任務棧 處理 : 這里要分兩種情況處理 , 該 Activity 實例在某個任務棧中存在 , 和 不存在該 Activity 實例的情況 ;
① 已存在 Activity 實例 : 當啟動一個 Activity 界面時 , 如果發現該 Activity 已經在一個任務棧中運行 , 此時不會啟動一個新的 Activity 實例 , 而是將該任務棧恢復到前臺 ;
② 不存在 Activity 實例 : 創建新的 Activity 實例 , 放入新的任務棧中 ;
四、 singleTask 模式 存在 Activity 實例的任務棧處理
對于已經存在的 Activity 實例任務棧中的操作 :
① Activity 實例不在任務棧棧頂 ( 返回堆棧有多個 Activity ) : 如果 Activity 實例不在棧頂 , 說明該 Activity 在棧底 , 并且上面還有若干 Activity 壓著 , 已經存在的 Activity 實例會接收到一個回調 , 調用 Activity.onNewIntent() 方法 , 同時設置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 標志位 , 清空除棧底根 Activity 之外的其它 Activity 實例 ;
-
新的 Intent 意圖 : 本次啟動界面將使用新的 Activity 啟動的 Intent ;
-
設置 Intent 標志 : 并且會設置 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 常量標志位 ;
② Activity 實例就在任務棧棧頂 ( 返回堆棧僅有一個 Activity ) : 如果 Activity 實例就在返回堆棧的棧頂 , 那么只需要調用 Activity 的 onNewIntent 方法即可 , 不用設置 Activity 的啟動標志位了 ;
- 新的 Intent 意圖 : 本次啟動界面將使用新的 Activity 啟動的 Intent ;
- 不設置 Intent 標志 : 該情況下 不設置 Activity 啟動標志位 ;
五、 FLAG_ACTIVITY_BROUGHT_TO_FRONT 常量解析
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 常量定義原型 :
public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT該標志位開發者不經常使用 , 一般情況下是在 棧頂復用模式 SingleTop 中由系統自動設置該標志位 ;
當用戶啟動一個 Activity 界面 , 如果系統發現啟動的 Activity 界面被設置了 SingleTop 棧頂復用模式 模式 , 就會自動為該 Activity 設置該標識 ;
六、 singleTask 棧內復用模式回退鍵行為
singleTask 棧內復用模式回退鍵行為 : 啟動 singleTask 棧內復用模式的 Activity 界面后 , 會在一個單獨的任務的返回堆棧棧底存放該 Activity 實例 , 此時如果點擊回退鍵 , 會回退到啟動該 Activity 實例的界面 , 與正常的回退操作一致 ;
七、 singleTask 棧內復用模式 啟動總結
啟動 singleTask 棧內復用模式 Activity 界面總結 :
① 沒有 Activity 實例 : 如果當前設備所有的任務棧中都沒有該 Activity 實例 , 那么就啟動新的 Activity 實例 , 放入一個新的任務棧中 ;
② 有該 Activity 實例的任務棧在前臺 :
- 該 Activity 實例在棧頂 : 直接調用 onNewIntent 方法復用 ;
- 該 Activity 實例不在棧頂 : 調用 onNewIntent 方法 , 并且設置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 標志清空除該根 Activity 之外的其它 Activity 實例 ;
③ 有該 Activity 實例的任務棧在前臺 : 先將該任務激活到前臺 , 然后執行下面操作 ;
- 該 Activity 實例在棧頂 : 直接調用 onNewIntent 方法復用 ;
- 該 Activity 實例不在棧頂 : 調用 onNewIntent 方法 , 并且設置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 標志清空除該根 Activity 之外的其它 Activity 實例 ;
八、 singleInstance 單實例模式
singleInstance 單實例模式與 singleTask 棧內復用模式 表現基本一致 , 唯一的區別是 singleInstance 模式的 Activity 所在的任務棧只能存在這個唯一的 Activity 實例 , 返回堆棧張紅不允許放入其它 Activity 實例 ;
總結
以上是生活随笔為你收集整理的【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Activi
- 下一篇: 【Android 性能优化】应用启动优化