我正在处理一个响应第三方应用程序意图的应用程序。第三方应用程序使用明确的意图打开我们应用程序的主要活动。
当我在app主活动中放置断点或运行adb shell dumpsys activity命令时,我看到他们使用了意图标志 FLAG_ACTIVITY_NEW_TASK
我们的活动使用启动模式 android:launchMode =" singleTask" 。您可能希望我们的应用程序能够在其自己的任务中打开。但事实并非如此。
这些是我注意到的结果
第一个问题:为什么会这样?根据文档,如果启动模式为单一任务且意图标记为 FLAG_ACTIVITY_NEW_TASK ,则确保新活动应在其自己的任务中打开。< / p>
这是我从Nexus 6上的dumpsys活动中得到的。我出于隐私原因删除了一些名称。
Task id #280
TaskRecord{a368235 #280 A=com.thirdPartyApp U=0 sz=4}
Intent { flg=0x10100000 cmp=com.thirdPartyApp.Activity1 }
Hist #3: ActivityRecord{2a95b00 u0 ca.myApp.Main t280}
Intent { act=ca.myApp.Main.ACTION cat=[android.intent.category.DEFAULT] flg=0x10000000 pkg=ca.myApp cmp=ca.myApp.Main bnds=[75,1648][1364,2937] (has extras) }
ProcessRecord{df568e7 19422:ca.myApp/u0a277}
Hist #2: ActivityRecord{d0c821b u0 com.thirdPartyApp.Activity3 t280}
Intent { cmp=com.thirdPartyApp.Activity3 (has extras) }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
Hist #1: ActivityRecord{26b0a9c u0 com.thirdPartyApp.Activity2 t280}
Intent { act=com.thirdPartyApp.ACTION cmp=com.thirdPartyApp.Activity2 (has extras) }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
Hist #0: ActivityRecord{3969feb u0 com.thirdPartyApp.Activity1 t280}
Intent { flg=0x10100000 cmp=com.thirdPartyApp bnds=[114,434][1325,1645] }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
从 flg = 0x10000000 标志中可以清楚地看到他们使用意图标志 FLAG_ACTIVITY_NEW_TASK https://developer.android.com/reference/android/content/Intent.html
调用myApp情况变得更糟。如果我返回主屏幕并从主屏幕启动myApp,它将在两个单独的任务中打开两次!
Task id #306
TaskRecord{664c4c7 #306 A=ca.myApp U=0 sz=1}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=ca.myApp.Main bnds=[113,378][337,602] (has extras) }
Hist #0: ActivityRecord{88825a0 u0 ca.myApp.Main t306}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=ca.myApp.Main bnds=[113,378][337,602] (has extras) }
ProcessRecord{df568e7 19422:ca.myApp.Main/u0a277}
Task id #280
TaskRecord{a368235 #280 A=com.thirdPartyApp U=0 sz=4}
Intent { flg=0x10100000 cmp=com.thirdPartyApp.Activity1 }
Hist #3: ActivityRecord{2a95b00 u0 ca.myApp.Main t280}
Intent { act=ca.myApp.Main.ACTION cat=[android.intent.category.DEFAULT] flg=0x10000000 pkg=ca.myApp cmp=ca.myApp.Main bnds=[75,1648][1364,2937] (has extras) }
ProcessRecord{df568e7 19422:ca.myApp/u0a277}
Hist #2: ActivityRecord{d0c821b u0 com.thirdPartyApp.Activity3 t280}
Intent { cmp=com.thirdPartyApp.Activity3 (has extras) }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
Hist #1: ActivityRecord{26b0a9c u0 com.thirdPartyApp.Activity2 t280}
Intent { act=com.thirdPartyApp.ACTION cmp=com.thirdPartyApp.Activity2 (has extras) }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
Hist #0: ActivityRecord{3969feb u0 com.thirdPartyApp.Activity1 t280}
Intent { flg=0x10100000 cmp=com.thirdPartyApp bnds=[114,434][1325,1645] }
ProcessRecord{6779824 7717:com.thirdPartyApp/u0a15}
第二个问题:当我删除 android:launchMode =&#34; singleTask&#34; 并在s3或Nexus 4上重新测试时,myApp会在与第三方应用相同的任务中打开。从这份文件https://developer.android.com/guide/components/tasks-and-back-stack.html中可以看出以下内容
如果两个活动都定义了活动B应该如何与任务相关联, 然后,活动A的请求(如意图中所定义)受到尊重 通过活动B的请求(如清单中所定义)。
从我的测试中可以清楚地看到Manifest属性对于intent标志。为什么会这样?