Android Activity的四種啟動模式

      網友投稿 947 2025-03-31

      前言

      記得第一次探討Activity的啟動模式,是在2017年8月份,那個時候對一年后走出校門的未來很是憧憬,時間真快,已經畢業四個月,工作和生活也都趨于穩定。

      一、小前言

      相信很多人和我一樣,在初學Android甚至初入職場的時候不了解Acticity的啟動模式,或者為了面試刷題刷到了,但并不理解啟動模式的作用,以及如何正確的使用啟動模式而不是所有的都是用默認模式。

      二、Activity啟動模式簡介

      Activity有四種啟動模式,standard、singleTop、singleTask、singleInstance,默認啟動模式是standard

      2.1?standard 模式

      程序啟動的時候,會默認創建一個任務棧,Activity是放在任務棧里面的,比如我們新建一個項目,默認生成一個ActivityA,那么此時任務棧是這樣的:

      ,比如我們在ActivityA中有一個按鈕,點擊按鈕跳轉到ActivityB,ActivityB中有一個按鈕,點擊按鈕跳轉到ActivityC,那么此時該棧是這樣的:

      那么如果在ActivityC中有個按鈕跳轉到ActivityB呢?沒錯,是再次創建一個ActivityB實例

      那么此時,我們點擊返回鍵,會首先移除棧頂的ActivityB,回到ActivityC,在移除棧頂的ActivityC回到ActivityB,以此類推。

      當Activity全部退出時,系統會自動回收這個空棧。

      2.2 singleTop模式

      改變Activity的啟動模式,可以在配置文件中為Activity添加lauchMode屬性

      singleTop模式為棧頂復用模式,通俗的說,就是如果棧頂的Activity和啟動的Activity的是同一個,那么就直接復用,比如還是在ActivityA中跳轉到ActivityB,我們將ActivityB的啟動模式設置為singleTop,因為當前棧頂是ActivityA,不是ActivityB,所以會創建新的ActivityB實例放入任務棧中

      現在我們在ActivityB中點擊按鈕跳轉ActivityB,因為當前棧頂就是ActivityB所以會直接復用,此時棧內仍是ActivityB和ActivityA,此時點擊返回按鈕會直接退回到ActivityA。

      Android Activity的四種啟動模式

      2.3 singleTask 模式

      singleTask是棧內復用模式,在這里棧內復用要區分要啟動的Activity的所需棧是否是當前棧

      2.3.1 是當前棧

      比如現在有ActivityA 啟動模式為singleTask ,在ActivityA中啟動ActivityB,ActivityB在棧中不存在實例,則創建ActivityB實例,此時棧為:

      假設現在在ActivityB中啟動ActivityA,會在當前棧中是否有ActivityA,若有則將ActivityA移到棧內,將位于ActivityA之上的移出棧頂,那么現在棧為:

      此時按返回鍵會直接退出程序,如果當前棧為

      我們現在啟動ActivityB中啟動ActivityA,則會將位于ActivityA棧頂的ActivityB、ActivityC以及ActivityB移出棧頂,此時棧內只是有ActivityA。

      2.3.1 不是當前棧

      不是當前棧的情況比較特殊,這里簡單介紹

      假設當前任務棧是A,A棧中有ActivityA、ActivityB,在B中啟動ActivityC,并且ActivityC所需的任務棧為B,棧B不存在所以會首先創建棧B,然后創建ActivityC實例放入棧B中

      那么我們如何指定啟動的Activity所需的棧名稱,這里就要說TaskAffinity參數,這里我們參考官方文檔:

      https://developer.android.com/guide/topics/manifest/activity-element?hl=zh-cn#aff

      TaskAffinity可以理解為任務親屬性或相關性,默認情況下,應用中的所有 Activity 都具有相同的親和關系

      默認任務棧的名字為應用包名,同樣我們可以在配置文件中設置TaskAffinity屬性,但必須和singleTask啟動模式配對使用

      2.4?singleInstance模式

      singleInstance模式也是"棧內"復用模式,不過,比如現在當前棧中有ActivityA,我們在A中啟動ActivityB,ActivityB的啟動模式是singleInstance,此時會創建一個新的任務棧,創建ActivityB實例將ActivityB放在新的任務棧中

      2.5 Java代碼設置啟動模式

      除了在配置文件中,我們還可以通過在Java代碼中設置啟動模式

      intent.setFlags();

      singleTask 對應 FLAG_ACTIVITY_NEW_TASK

      singleTop 對應 FLAG_ACTIVITY_SINGLE_TOP

      歡迎關注技術公眾號,微信號搜索ColorfulCode 代碼男人

      分享技術文章,投稿分享,不限技術種類,不限技術深度,讓更多人因為分享而受益。

      Android

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么桌面上不顯示視頻轉換功能了(微信視頻怎樣不顯示自己畫面又不能切換)
      下一篇:word文檔中a4頁面設置方法(文檔頁面a4怎么設置)
      相關文章
      精品亚洲一区二区三区在线观看 | 亚洲AV中文无码字幕色三| 色婷婷亚洲一区二区三区| 亚洲日韩AV一区二区三区四区 | 亚洲视频在线播放| 亚洲成AV人片在WWW色猫咪| 中文字幕专区在线亚洲| 国产成人毛片亚洲精品| 久久99亚洲综合精品首页| 久久久青草青青国产亚洲免观| 久久99亚洲综合精品首页| 国产精品V亚洲精品V日韩精品| 亚洲精品一级无码鲁丝片| 无码专区一va亚洲v专区在线| 精品久久久久亚洲| 五月天婷亚洲天综合网精品偷| 国产精品亚洲色图| 毛片亚洲AV无码精品国产午夜| 亚洲高清偷拍一区二区三区| 亚洲第一黄色网址| 亚洲午夜日韩高清一区| 国产亚洲精品a在线观看| 亚洲人成网亚洲欧洲无码久久| 亚洲精品国精品久久99热一| 亚洲成a人片在线观看无码专区| 亚洲av永久无码制服河南实里| 亚洲国产天堂久久综合网站| 91嫩草私人成人亚洲影院| 亚洲精品永久www忘忧草| 亚洲另类自拍丝袜第1页| 亚洲精品伊人久久久久| 亚洲夂夂婷婷色拍WW47| 蜜芽亚洲av无码一区二区三区| 国产精品国产亚洲区艳妇糸列短篇| 成人亚洲国产精品久久| 久久久久亚洲?V成人无码| 国产亚洲婷婷香蕉久久精品| 亚洲久本草在线中文字幕| 亚洲制服丝袜一区二区三区| 亚洲性无码AV中文字幕| MM1313亚洲国产精品|