Activity 啟動模式與標記位

參考資料

  1. http://www.androidchina.net/2649.html
  2. 《Android開發(fā)藝術探索》

Activity的LaunchMode##

啟動模式共有4種,standard、singleTop、singleTask和singleInstance;

standard標準模式:####

也是默認模式,每啟動一個Activity都有創(chuàng)建一個實例,并入棧;在這種模式下,誰啟動了她,她的實例就運行在啟動她的那個Activity所在棧中;
當用ApplicationContext去啟動standard模式的Activity時會報錯,這是因為standard模式的Activity模式會進入啟動她的Activity所屬的任務棧中,非Activity類型的Context沒有任務棧;

ApplicationContext啟動Activity報的錯誤

解決方法就是為待啟動的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

  1. Activity的歸屬,也就是Activity應該在哪個Task中,Activity與Task的吸附關系。一般情況下在同一個應用中,啟動的Activity都在同一個Task中,它們在該Task中度過自己的生命周期;

  2. 每個Activity都有taskAffinity屬性,她指定該Activity希望進入的Task。如果Activity沒有顯示指明taskAffinity,那么她的這個屬性就等于Application指定的taskAffinity,如果Application也沒有指定,那么taskAffinity的值等于包名。

  3. task也有自己的affinity屬性,等于她的根Activity的taskAffinity的值;

這就解釋了上面沒有創(chuàng)建新的任務棧情況了;

通過指定Activity的taskAffinity屬性后,打印結果如下:

不同taskAffinity

singleTop模式:####

棧頂復用模式,如果Activity位于棧頂,注意是頂,那么該Activity不會再次創(chuàng)建,同時她的onNewIntent會被回調;

singleTask模式:####

棧內復用模式,并自帶ClearTop效果,即:她上面的Activity會全部出棧,一般,我們的主界面可設置成此模式,當推送通知來了,啟動她,回主頁時,然后再執(zhí)行推送的內容;

singleInstance單實例模式:####

除了有singleTask模式的特性外,另外她獨自運行在新的任務棧;以后創(chuàng)建她,都不會重新創(chuàng)建了。除非她銷毀了;

給Activity指定啟動模式:##

  1. 通過清單文件配置。launchMode屬性;
  2. 通過Intent設置標記位;

Activity 的Flags

  1. FLAG_ACTIVITY_NEW_TASK: 指定Activity的為‘singleTask’啟動模式,與在xml指定該模式相同;
  2. FLAG_ACTIVITY_SINGLE_TOP: 指定為“singleTop”模式,類似在xml指定為該模式相同;
    3.FLAG_ACTIVITY_CLEAR_TOP: 啟動該Activity時,在同一個任務棧所有位于它上面的Activity都要出棧;此標記一般和singleTask啟動模式配合使用,如果是標準模式的Activity,連同自己和上面的都要出棧;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容