【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )
文章目錄
- I . 默認啟動模式 ( standard )
- II . 棧頂復用啟動模式 ( singleTop )
- III . 棧內復用啟動模式 ( singleTask )
- IV . 單實例啟動模式 ( singleInstance )
- V . 棧內復用 FLAG 標識 ( FLAG_ACTIVITY_CLEAR_TOP )
I . 默認啟動模式 ( standard )
默認模式 ( standard ) : 最簡單的模式 , 每次啟動一個 Activity 就創建一個新的 Activity 實例 , 放入返回堆棧中 ;
AndroidMenifest.xml 設置方式 :
<activityandroid:name=""android:launchMode="standard"/>總結 : 默認模式下 , Activity 是可以實例化多次的 , 返回堆棧內可以相鄰存放相同的 Activity 界面實例 ;
II . 棧頂復用啟動模式 ( singleTop )
棧頂復用模式 ( singleTop ) : 要跳轉到 Activity X ;
① 如果 發現當前返回堆棧棧頂的界面就是 Activity X 實例 , 會直接調用該 Activity X 實例 的 onNewIntent() 方法 , 將跳轉用的 Intent 轉給棧頂的 Activity X 實例 , 不再創建新的界面入棧 ;
② 如果 返回堆棧 內沒有 Activity X 實例 , 那么創建一個新 Activity X 實例并入棧 ;
③ 如果返回堆棧內 有 Activity X 實例 , 但是沒有在棧頂 , 那么也創建一個新 Activity X 實例并入棧 ;
AndroidMenifest.xml 設置方式 :
<activityandroid:name=""android:launchMode="singleTop"/>Intent 標志位 設置方式 :
Intent intent = new Intent(); intent.setClass(FirstActivity.this, SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);III . 棧內復用啟動模式 ( singleTask )
獨立任務 啟動模式 ( singleTask ) : 要跳轉到 Activity X ;
① 發現 現有任務的 返回堆棧中存在 Activity X 實例 , 會直接調用該 Activity X 實例 的 onNewIntent() 方法 , 將跳轉用的 Intent 轉給棧頂的 Activity X 實例 , 不再創建新的界面入棧 , 同時會將返回堆棧內該 Activity X 實例之上的 Activity 界面進行出棧操作 ;
② 如果現有任務中不存在該實例 , 那么會創建新的 任務 及 返回堆棧 , 實例化新的 Activity X 對象 , 并當做根 Activity ;
使用場景 : 在自己的應用中 , 啟動第三方瀏覽器 或 播放器 , 那么這些第三方的應用界面 , 不應該加入到自己開發的任務棧中 , 而是創建一個新任務 , 將這些第三方的應用啟動界面 , 放入新的返回堆棧中 , 這些啟動界面應該設置成 singleTask 模式 ;
如果這些第三方應用已經被啟動過 , 在后臺運行 , 那么再次啟動會將這個界面所在的任務轉到前臺運行 ;
AndroidMenifest.xml 設置方式 :
<activityandroid:name=""android:launchMode="singleTask"/>Intent 標志位 設置方式 :
Intent intent = new Intent(); intent.setClass(FirstActivity.this, SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);要注意區分 棧內復用模式 ( singleTask 啟動模式 ) 與 Intent 標志位 : Intent.FLAG_ACTIVITY_CLEAR_TOP 的區別 , 這兩個設置的行為不完全一致 ;
FLAG_ACTIVITY_CLEAR_TOP 標志位不會啟動新的任務 ;
一般情況下 , 在應用中是不適用該啟動模式的 , 常用 FLAG_ACTIVITY_CLEAR_TOP 與 默認啟動模式 ( standard ) 結合的方式實現 返回堆棧內只有一個 特定的 Activity ;
IV . 單實例啟動模式 ( singleInstance )
單實例啟動模式 ( singleInstance ) : 要跳轉到 Activity X ( singleInstance 啟動模式 ) ;
① 不存在實例 : 如果當前所有任務中 , 都沒有 Activity X 實例 , 那么在一個新任務中創建 Activity X 實例 , 并放入返回堆棧 棧底 ;
② 存在實例 : 如果當前其它任務中有該實例 , 那么通過調用 onNewIntent() 方法轉到該實例 ;
③ 獨占返回堆棧 : 該 Activity X 實例所在的堆棧只有一個界面實例 , 即 一個任務只有這唯一的一個 界面 ;
④ 啟動其它界面 : 在該 單實例啟動模式 ( singleInstance ) 界面中啟動其它界面 , 都在其它的任務中打開 , 本任務只能有這一個界面 ;
AndroidMenifest.xml 設置方式 :
<activityandroid:name=""android:launchMode="singleInstance"/>這個模式一般也不常用 ;
V . 棧內復用 FLAG 標識 ( FLAG_ACTIVITY_CLEAR_TOP )
1 . FLAG_ACTIVITY_CLEAR_TOP 標識 : 要跳轉到 Activity X ;
① 存在該 Activity 實例 : 發現當前返回堆棧中存在 Activity X 實例 , 會直接調用該 Activity X 實例 的 onNewIntent() 方法 , 將跳轉用的 Intent 轉給棧頂的 Activity X 實例 , 不再創建新的界面入棧 , 同時會將返回堆棧內該 Activity X 實例之上的 Activity 界面進行出棧操作 ;
( 這個操作與棧內復用啟動模式相同 , 但是僅限于返回堆棧中存在該實例的情況 , 如果不存在 , 就要執行別的操作 )
② 不存在該 Activity 實例 : 如果當前返回堆棧中沒有該 Activity X 實例 , 就需要根據該 Activity 配置的啟動模式的行為來啟動新的界面 ;
2 . Intent 標志位 設置方式 :
Intent intent = new Intent(); intent.setClass(FirstActivity.this, SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);3 . 常用場景 : 經常使用 FLAG_ACTIVITY_CLEAR_TOP 與 默認啟動模式 ( standard ) 結合的方式實現 返回堆棧內只有一個 特定的 Activity ;
① 不存在 : 當前返回堆棧中如果沒有該界面 , 那么創建一個新的界面 , 放入該返回堆棧中 ;
② 存在 : 當前返回堆棧中如果有該界面 , 那么直接復用該界面 , 該界面上面的 Activity 直接退棧處理 ;
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】线程安全队列 ( 条件
- 下一篇: 【C++ 语言】引用 ( 引用简介 |