標準啓動Standard模式版本差別:android
在Lollipop以前,每次以MULTIPLE啓動的Activity都會被壓入當前任務的頂部,啓動 N 次,在當前任務就會出現 N 個Activity的實例,每次Back鍵就會銷燬一個,直到按了 N 次Back鍵。git
從Lollipop開始,若是要以MULTIPLE啓動Activity都是來自同一應用,那麼仍是會像以前同樣,壓入當前任務的頂部; 若是是來自不一樣應用,那麼將會建立一個新的任務存放不一樣應用的activity,而後將Activity的實例壓入新的任務中。Lollipop作的優化主要是針對多任務的顯示。github
SingleTask的兩種狀況:優化
考慮第一種實例存在:若是某個任務中存在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