天天看點

Activity的Flags

Activity的Flags有很很多,這裡分析一下比較常用的标記位.

FLAG_ACTIVITY_NEW_TASK

這個标記位的作用是為Activity指定"singletask"啟動模式,它的效果和在XMl中指定該啟動模式相同

FLAG_ACTIVITY_SINGLE_TOP 這個标記位的作用是為Activity指定"singletop"啟動模式,它的效果和在XML中指定該啟動模式相同

FLAG_ACTIVITY_CLEAR_TOP 具有此标記位的Activity,當它啟動時,在同一個任務棧中所有位于他上面的Activity都要出棧,這個标記位一般和singletask啟動模式一起出現,在這種情況下,呗啟動的Activity的執行個體如果已經存在,那麼系統就會調用它的onNewIntent.如果被啟動的Activity采用standard模式啟動,那麼它連同它之上的Activity都要出棧,系統會建立新的Activity執行個體并放入棧頂.

FLAG_ACTIVITY_EXCLUDE-FROM_RECENTS 其對應在AndroidManifest中的屬性為android:excludeFromRecents=“true”。 從該Flag的字面意思是将Activity從Recents中排除。那麼這個Recents指的是什麼意思呢?根據官網的解釋是一個剛剛已經加載過的Activity的清單,粗略的也可以了解為Android 手機上多任務管理鍵被按下去後的效果。 假設現在App中存在兩個Activity A和B,而我們隻在AndroidManifest中添加如下代碼:     <activity

    android:name=".Activity_A"

    android:excludeFromRecents="true"/>

    <activity

    android:name=".Activity_B"/> 編譯運作之後測試發現即使我們從B中進入主界面再檢視多任務管理器清單仍然無法看到。那麼為什麼會出現這種情況呢?

通過查閱Android 源碼發現,一個Application 中所有的Activity預設會使用同一個taskAffinity屬性值,也可以了解為擁有相同的taskAffinity屬性值的Activity會處在同一個任務棧中。是以在這種情況下,我們提到的A和B都是處在相同的任務棧中的。而當A中設定了android:excludeFromRecents=”true”之後,系統會将A所處的任務棧從多任務管理器中移除,是以即便我們設定B為加載的入口不進入A依然無法從多任務管理器中出現。

那麼我們如何在同一個App中設定多個任務棧呢?  

答案是通過借助TaskAffinity這個參數,一般情況下所有的Activity都會預設使用相同的taskAffinity參數。我們可以通過在AndroidManifest中規定Activity的taskAffinity屬性,并配合singleTask的啟動模式來達到我們想要的多任務棧效果。任務棧名稱和taskAffinity屬性值相同。

    <activity

    android:name=".Activity_A"/>

    <activity

    android:name=".Activity_B"

    android:launchMode="singleTask"

    android:taskAffinity="com.example.Activity_B"/>

在此我們讓A處于預設的任務棧中不做修改,讓B處于名稱為”com.example.Activity_B”的任務棧中,并規定B的啟動模式為singleTask。

當我們啟動App,并依次打開Activity A和B。這時我們打開多任務管理器就會看到同一個App的兩個任務。

當我們在Activity A中加入android:excludeFromRecents=“true”時,就隻會看到多任務管理器中隻存在B并不會看到A。