Activity啓動模式需注意的坑

標準啓動Standard模式版本差別:android

  • 在Lollipop以前,每次以MULTIPLE啓動的Activity都會被壓入當前任務的頂部,啓動 N 次,在當前任務就會出現 N 個Activity的實例,每次Back鍵就會銷燬一個,直到按了 N 次Back鍵。git

  • 從Lollipop開始,若是要以MULTIPLE啓動Activity都是來自同一應用,那麼仍是會像以前同樣,壓入當前任務的頂部; 若是是來自不一樣應用,那麼將會建立一個新的任務存放不一樣應用的activity,而後將Activity的實例壓入新的任務中。Lollipop作的優化主要是針對多任務的顯示。github

SingleTask的兩種狀況:優化

  1. 待啓動的Activity實例存在;
  2. 待啓動的Activity實例不存在。

 

 考慮第一種實例存在:若是某個任務中存在Activity實例,則僅僅是調用已有實例的onNewIntent()方法,在這以前,若是已有Activity實例不是位於任務頂,那麼在它之上的其餘Activity都會被銷燬,確保目標Activity位於棧頂。spa

 

 考慮第二種實例不存在:code

    啓動Activity的實例不存在,這時候確定會新建一個Activity的實例,可是否會新建一個任務呢?這又得分狀況討論,關鍵在於 taskAffinity這個屬性。xml

   新建的Activity實例須要尋找一個宿主任務,當某個任務的affinity屬性(TaskRecord.affinity)與Activity實例的taskAffinity屬性(ActivityRecord.taskAffinity)相同時,則認爲找到了宿主任務。繼承

   因此,是否新建一個任務,還取決於taskAffinity屬性。ip

若是沒有爲<Activity>標籤設置android:taskAffinity屬性,則會繼承自<Application>標籤; 若是<Application>標籤也沒有設置,則taskAffinity就是包名。 在這種狀況下,從Application 1中的Activity A以singleTask模式啓動Activity B時,並不會新建任務,而是將Activity B壓入已有任務的頂部,就像standard模式同樣。除非將<ActivityB>設置爲一個新的值:it

<activity android:name=".ActivityB" android:taskAffinity="" />

這時候,Activity B就會在一個新的任務中啓動,而且新任務的affinity屬性爲空

參考資料:

http://duanqz.github.io/2016-01-21-Activity-LaunchMode

相關文章
相關標籤/搜索