參考資料
- http://www.androidchina.net/2649.html
- 《Android開發(fā)藝術探索》
Activity的LaunchMode##
啟動模式共有4種,standard、singleTop、singleTask和singleInstance;
standard標準模式:####
也是默認模式,每啟動一個Activity都有創(chuàng)建一個實例,并入棧;在這種模式下,誰啟動了她,她的實例就運行在啟動她的那個Activity所在棧中;
當用ApplicationContext去啟動standard模式的Activity時會報錯,這是因為standard模式的Activity模式會進入啟動她的Activity所屬的任務棧中,非Activity類型的Context沒有任務棧;

解決方法就是為待啟動的Activity指定FLAG_ACTIVITY_NEW_TASK標記位; 這樣就會一個新的任務棧。如果設置待啟動的Activity的taskAffinity時,待啟動的Activity是以singleTask模式啟動的;
查看任務棧的代碼
public static void analyseTaskInfo(Context context) {
ActivityManager am = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTaskInfoList = am.getRunningTasks(10);
for (ActivityManager.RunningTaskInfo runningTaskInfo : runningTaskInfoList) {
Log.e(TAG, "id: " + runningTaskInfo.id);
Log.e(TAG, "description: " + runningTaskInfo.description);
Log.e(TAG, "number of activities: " + runningTaskInfo.numActivities);
Log.e(TAG, "topActivity: " + runningTaskInfo.topActivity);
Log.e(TAG, "baseActivity: " + runningTaskInfo.baseActivity.toString());
}
}
當使用Activity Context啟動標準模式下的Activity,我們查看任務棧信息如下:

當使用Application Context時:

說明
不是說好了,會創(chuàng)建任務棧嗎?沒有啊,這是因為在taskAffinity相同的情況下,單獨添加FLAG_ACTIVITY_NEW_TASK不起任何作用;
taskAffinity:
Activity的歸屬,也就是Activity應該在哪個Task中,Activity與Task的吸附關系。一般情況下在同一個應用中,啟動的Activity都在同一個Task中,它們在該Task中度過自己的生命周期;
每個Activity都有taskAffinity屬性,她指定該Activity希望進入的Task。如果Activity沒有顯示指明taskAffinity,那么她的這個屬性就等于Application指定的taskAffinity,如果Application也沒有指定,那么taskAffinity的值等于包名。
task也有自己的affinity屬性,等于她的根Activity的taskAffinity的值;
這就解釋了上面沒有創(chuàng)建新的任務棧情況了;
通過指定Activity的taskAffinity屬性后,打印結果如下:

’
singleTop模式:####
棧頂復用模式,如果Activity位于棧頂,注意是頂,那么該Activity不會再次創(chuàng)建,同時她的onNewIntent會被回調;
singleTask模式:####
棧內復用模式,并自帶ClearTop效果,即:她上面的Activity會全部出棧,一般,我們的主界面可設置成此模式,當推送通知來了,啟動她,回主頁時,然后再執(zhí)行推送的內容;
singleInstance單實例模式:####
除了有singleTask模式的特性外,另外她獨自運行在新的任務棧;以后創(chuàng)建她,都不會重新創(chuàng)建了。除非她銷毀了;
給Activity指定啟動模式:##
- 通過清單文件配置。launchMode屬性;
- 通過Intent設置標記位;
Activity 的Flags
- FLAG_ACTIVITY_NEW_TASK: 指定Activity的為‘singleTask’啟動模式,與在xml指定該模式相同;
- FLAG_ACTIVITY_SINGLE_TOP: 指定為“singleTop”模式,類似在xml指定為該模式相同;
3.FLAG_ACTIVITY_CLEAR_TOP: 啟動該Activity時,在同一個任務棧所有位于它上面的Activity都要出棧;此標記一般和singleTask啟動模式配合使用,如果是標準模式的Activity,連同自己和上面的都要出棧;