Activity的啟動模式全解standard,singleTop,singleTask,singleInstance


在android中控制Activity的啟動模式的屬性主要控制兩大功能:

1,控制activity 進入哪一個任務task 中,   有兩種可能,進入啟動task中,進入指定taskAffinity的task中,如果指定taskAffinity的task還不存在,則創建一個

2,控制activity 多次啟動的處理模式,       有三種可能,每次都創建新的,如果在頂部不創建新的,  如果存在則清除之上所有的activity

 

activity的taskAffinity屬性值默認為application的taskAffinity屬性值,application的taskAffinity屬性值默認為包名 

手動設置taskAffinity屬性值時,可以設置任意字符串但是必須包含至少一個'.'點符號,否則apk會在安裝時解析包錯誤

Activity的啟動模式中多次啟動的處理模式要先確定activity進入的task

activity 的launchMode 靜態設置時有四種模式,動態設置(intent flag)時常用的有三種 ,其中讓taskAffinity屬性起作用的有兩種模式 singleTaskFLAG_ACTIVITY_NEW_TASK ,其他launchMode啟動模式taskAffinity屬性無效 

  • launchMode      standard      進入啟動task,每次都創建新的實例進入task頂部

                            singleTop    進入啟動task,如果已有實例並且在task頂部不創建新實例,調用原實例的onNewIntent(),其它情況都創建新的實例進入task頂部

    •                singleTask   進入指定taskAffinity的task,如果指定的task存在,將task移到前台,如果指定task不存在,創建指定taskAffinity的task
    •                                    如果task中存在實例,則移除實例之上的所有實例並顯示出來,執行原實例的onNewIntent(),其它情況則創建實例進入task頂部
    •               singleInstance   進入新的task,並且此task內只存在此一個activity ,不再加入別的activity
    •                                          如果task中存在實例,執行實例的onNewIntent()                  
  • taskAffinity起作用時:       進入指定taskAffinity的task,如果指定的task存在,將task移到前台,如果指定task不存在,創建指定taskAffinity的task 

                                

 

 

而在Intent當中,flag屬性控制activity的啟動模式:

     FLAG_ACTIVITY_NEW_TASK    進入指定taskAffinity的task,如果指定的task存在,將task移到前台,如果指定task不存在,創建指定taskAffinity的task                                                          

                                                      每次都創建新的實例進入task頂部

     FLAG_ACTIVITY_SINGLE_TOP   進入啟動task

                                                         如果已有實例並且在task頂部不創建新實例,執行實例的onNewIntent(),其它情況都創建新的實例進入task頂部

 

     FLAG_ACTIVITY_CLEAR_TOP    進入啟動task

                                                         如果task中存在實例,則移除實例之上的所有實例,如果啟動的activity啟動模式不是standard模式,或者flag有FLAG_ACTIVITY_SINGLE_TOP屬性

                                                         那么調用Activity B的onNewIntent()方法否則銷毀原有實例創建新實例進入task頂部,其它情況則創建實例進入task頂部

 

 

 

 

對activity的啟動模式屬性中Intent的flag屬性覆蓋<activity>元素中屬性設置;

 

在<activity>元素中,有以下幾個屬性是可以使用的:

  • taskAffinity
  • launchMode
  • allowTaskReparenting
  • clearTaskOnLaunch
  • alwaysRetainTaskState
  • finishOnTaskLaunch

 

而在Intent當中,有以下幾個flag是比較常用的:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP

 

 

處理affinity

 

affinity可以用於指定一個Activity更加願意依附於哪一個任務,在默認情況下,同一個應用程序中的所有Activity都具有相同的affinity,所以,這些Activity都更加傾向於運行在相同的任務當中。當然了,你也可以去改變每個Activity的affinity值,通過<activity>元素的taskAffinity屬性就可以實現了。

 

taskAffinity屬性接收一個字符串參數,你可以指定成任意的值(經我測試字符串中至少要包含一個.),但必須不能和應用程序的包名相同,因為系統會使用包名來作為默認的affinity值。

 

affinity主要有以下兩種應用場景:

  • 當調用startActivity()方法來啟動一個Activity時,默認是將它放入到當前的任務當中。但是,如果在Intent中加入了一個FLAG_ACTIVITY_NEW_TASK flag的話(或者該Activity在manifest文件中聲明的啟動模式是"singleTask"),系統就會嘗試為這個Activity單獨創建一個任務。但是規則並不是只有這么簡單,系統會去檢測要啟動的這個Activity的affinity和當前任務的affinity是否相同,如果相同的話就會把它放入到現有任務當中,如果不同則會去創建一個新的任務。而同一個程序中所有Activity的affinity默認都是相同的,這也是前面為什么說,同一個應用程序中即使聲明成"singleTask",也不會為這個Activity再去創建一個新的任務了。
  • 當把Activity的allowTaskReparenting屬性設置成true時,Activity就擁有了一個轉移所在任務的能力。具體點來說,就是一個Activity現在是處於某個任務當中的,但是它與另外一個任務具有相同的affinity值,那么當另外這個任務切換到前台的時候,該Activity就可以轉移到現在的這個任務當中。
    那還是舉一個形象點的例子吧,比如有一個天氣預報程序,它有一個Activity是專門用於顯示天氣信息的,這個Activity和該天氣預報程序的所有其它Activity具體相同的affinity值,並且還將allowTaskReparenting屬性設置成true了。這個時候,你自己的應用程序通過Intent去啟動了這個用於顯示天氣信息的Activity,那么此時這個Activity應該是和你的應用程序是在同一個任務當中的。但是當把天氣預報程序切換到前台的時候,這個Activity又會被轉移到天氣預報程序的任務當中,並顯示出來,因為它們擁有相同的affinity值,並且將allowTaskReparenting屬性設置成了true。

清空返回棧

 

如何用戶將任務切換到后台之后過了很長一段時間,系統會將這個任務中除了最底層的那個Activity之外的其它所有Activity全部清除掉。當用戶重新回到這個任務的時候,最底層的那個Activity將得到恢復。這個是系統默認的行為,因為既然過了這么長的一段時間,用戶很有可能早就忘記了當時正在做什么,那么重新回到這個任務的時候,基本上應該是要去做點新的事情了。

 

當然,既然說是默認的行為,那就說明我們肯定是有辦法來改變的,在<activity>元素中設置以下幾種屬性就可以改變系統這一默認行為:

 

alwaysRetainTaskState

如果將最底層的那個Activity的這個屬性設置為true,那么上面所描述的默認行為就將不會發生,任務中所有的Activity即使過了很長一段時間之后仍然會被繼續保留。

 

clearTaskOnLaunch

如果將最底層的那個Activity的這個屬性設置為true,那么只要用戶離開了當前任務,再次返回的時候就會將最底層Activity之上的所有其它Activity全部清除掉。簡單來講,就是一種和alwaysRetainTaskState完全相反的工作模式,它保證每次返回任務的時候都會是一種初始化狀態,即使用戶僅僅離開了很短的一段時間。

 

finishOnTaskLaunch

這個屬性和clearTaskOnLaunch是比較類似的,不過它不是作用於整個任務上的,而是作用於單個Activity上。如果某個Activity將這個屬性設置成true,那么用戶一旦離開了當前任務,再次返回時這個Activity就會被清除掉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM