一萨蚕、簡介
哪些情況下開啟一個 Activity 會在新的 task 運行,哪些情況下會繼續(xù)在原來的task 運行板祝。
activity.getTaskId()
每個 Activity 運行時都有一個其歸屬的 task棧献起,我們可以用 activity.getTaskId() 的方法得到當前 activity 的taskId口蝠。如果兩個 activity 的 taskId 不同牡昆,則他們肯定不會屬于同一個 task姚炕。
public class MyApplication extends Application {
private static final String TAG_APP = MyApplication.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG_APP,"MyApplication#onCreate"+Thread.currentThread().getName();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
//已過濾無用代碼,只在onresume 讀取相關數(shù)據(jù)
@Override
public void onActivityResumed(Activity activity) {
Log.d(TAG_APP,"onActivityResumed+"+activity.getClass().getSimpleName()+"####taskid = "+activity.getTaskId());
}
});
}
}
taskAffinity 的使用方式如下
如上圖所示丢烘,taskaffinity 可以單獨對一個 activity 使用,代表該 activity 所想歸屬的 task些椒;
也能對application 使用播瞳,代表該 application 內(nèi)聲明的所有 activity 都歸屬于這個task。
如果 activity 組件沒有聲明 taskAffinity 的話免糕,該 activity 的 taskAffinity 屬性也是有默認值的赢乓。如果 application 指定了 taskAffinity 值,默認值就是 application 指定的 taskAffinity 值石窑;如果 application 未指定的話牌芋,默認值就是 manifest 中聲明的包名(package 對應的字符串)。
任務列表
Android 手機的任務列表就是根據(jù)不同 task 彈出的松逊,我們可以根據(jù)任務管理器有幾個 item 圖標躺屁,來知道我們開啟了幾個 task。
是否開啟新的Task
是不是我指定了一個 Activity 的 taskAffinity 值(跟包名不同)经宏,運行該 Activity 時犀暑,是否就會新開這個 task棧呢?
答案是否定的烁兰,一個 Activity 運行時所歸屬的task耐亏,默認是啟動它 的那個Activity 所在的 task(下文將會驗證)。
taskAffinity生效
taskAffinity 單獨使用并不會生效沪斟。
要想其生效广辰,需要配合其他屬性使用,或者配合 Intent.FLAG_ACTIVITY_NEW_TASK,或者配合
allowTaskReparenting 择吊。使用時用其中的一個就行李根,下面將詳細介紹這兩個屬性。
二干发、啟動新的Task
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_NEW_TASK 使用方式如下朱巨,
Intent intent = new Intent(this,IntentTimeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
當 AMS 發(fā)現(xiàn)啟動了一個帶有 FLAG_ACTIVITY_NEW_TASK 標簽的 Activity 時,會先去尋找當前是否存在這個 Activity 的 task 值(這個值具體是什么可看 知識點2)枉长,如果不存在的話冀续,就會創(chuàng)建該task,如果存在就省去了創(chuàng)建 task 這個步驟必峰。然后在把要啟動的 Activity 添加到 task 中洪唐。
AMS 分配的taskid 是線性遞增的,每次開啟一個新的task 吼蚁,taskid 永遠都是 +1 的操作凭需。
android:launchMode="singleTask"
<activity
android:name=".MainActivity2"
android:launchMode="singleTask"
android:taskAffinity="com.example.taskaffinity.newtask" />
allowTaskReparenting 相關
llowTaskReparenting 這個屬性指的是一個 Activity 運行時,可以重新選擇自己所屬的task肝匆×r冢基本是在跨app 間調(diào)用時。
// 將 allowTaskReparenting 設置為 true
<activity android:name=".Main2Activity"
android:allowTaskReparenting="true">
<intent-filter>
<action android:name="xxx.xxx.xxx"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
若 Activity taskAffinity指定的task 已經(jīng)存在旗国,是會復用之前的task枯怖,而不會再重新創(chuàng)建一個新的task。