<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              當前滾動:安卓怎么開啟啟動模式?Android四種啟動模式

              來源:CSDN 時間:2022-12-19 10:23:54

              標準模式(Standard)


              (相關資料圖)

              標準模式(Standard),這也是系統默認模式,每次啟動一個activity都會重新創建一個新的實例,不關這個實例是否存在; ApplicationContext去啟動standard模式的Activity的時候就會報錯:

              android.util.androidruntiomException: Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_TASK flag . Is this really what are want?

              因為我們的standard模式的Activity默認會進入啟動它的Activity所屬的任務棧中,但是由于非Activity類型的Context(如ApplicationContext)并沒有所謂的任務棧,所以這就有問題了,解決這個問題,就是待啟動Activity指定FLAG_ACTIVITY_TASK標記位,這樣啟動的時候就會為他創建一個新的任務棧,這個時候待啟動Activity實際上是以singleTask模式啟動的。

              棧頂復用模式(SingleTop)

              棧頂復用模式(SingleTop),棧頂復用模式,在這個模式下,如果新的Activity已經位于任務棧的棧頂,那么此Activity不會被重新創建,同時他的onNewIntent方法會被調用,通過此方法的參數我們可以取出當前請求的信息

              棧內復用模式(SingleTask)

              棧內復用模式(SingleTask)棧內復用模式,這是一種單實例模式,在這種模式下,只要Activity在一個棧內存在,那么多次啟動此Activity都不會創建實例,和singTop一樣,系統也會回調其onNewIntent方法;

              TaskAffinity,可以翻譯成任務相關性,這個參數標示了一個Activity所需要的任務棧的名字默認情況下,所有的Activity所需要的任務棧的名字為應用的包名,可以為每個Activity都單獨指定TaskAffinity,這個屬性值必須必須不能和包名相同,否則就相當于沒有指定,TaskAffinity屬性主要和singleTask啟動模式或者allowTaskReparenting屬性配合使用,在其他狀況下沒有意義,另外,任務棧分為前臺任務棧和后臺任務棧,后臺任務棧中的Activity位于暫停狀態,用戶可以通過切換將后臺任務棧再次調為前臺

              當TaskAffinity和singleTask啟動模式配對使用的時候,他是具有該模式Activity目前任務棧的名字,待啟動的Activity會運行在名字和TaskAffinity相同的任務棧中

              當TaskAffinity和allowTaskReparentiing結合的時候,當一個應用A啟動了應用B的某一個Activity后,如果這個Activity會直接從應用A的任務棧轉移到應用B的任務棧中,這還是很抽象的,再具體點,比如現在有2個應用A和B,A啟動了B的一個Activity C ,然后按Home鍵回到桌面,然后再單擊B的桌面圖標,這個時候并不是啟動; B的主Activity,而是重新顯示了已經被應用A啟動的Activity C,或者說,C從A的任務棧轉移到了B的任務棧中,可以這么理解,由于A啟動了C,這個時候C只能運行在A的任務棧中,但是C屬于B應用,正常情況下,他的TaskAffinity值肯定不可能和A的任務棧相同(因為包名不同),所以,當B啟動后,B會創建自己的任務棧,這個時候系統發現C原本所想要的任務棧已經被創建出來了,所以就把C從A的任務棧中轉移過來

              單實例模式(SingleInstance)

              單例模式(SingleInstance),這是一種加強的singleTask的模式,他除了具有singleTask的所有屬性之外,還加強了一點,那就是具有此模式下的Activity只能單獨的處于一個任務棧中,換句話說,比如Activity A是singleInstance模式,當A啟動的時候,系統會為創建創建一個新的任務棧,然后A獨立在這個任務棧中,由于棧內復用的特性,后續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷毀了

              兩種設置啟動模式的方法

              第一種

              第二種

              Intent intent = new Intent(); intent.setClass(this,SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

              兩種都可以設置activity的啟動模式 ,第二種優先級更高,同時存在時以第二種為準,兩種方式限定范圍有所不同,第一種方式無法直接為Activity設置FLAG_ACTIVITY_CLEAR_TOP標識,而第二種方式無法指定singleInstance模式

              責任編輯:

              標簽: 這個時候

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩