我必须像这样应用堆栈:
A->BC->D
X->Y
在 Y 我想使用 getLaunchIntentForPackage("package") 到 D,但是我到了 A。我应该使用什么启动模式等?如果可能的话,我想将 singleTask 用于 ABCD。同样,当在 D 中时,我按下 home 并再次通过 A 图标启动,然后根据启动模式,我没有到达 D(我想要的),但到达 A。DCB 被清除。
我尝试了很多东西,但我就是不明白它是如何工作的。我似乎没有得到相应的行为。
我必须像这样应用堆栈:
A->BC->D
X->Y
在 Y 我想使用 getLaunchIntentForPackage("package") 到 D,但是我到了 A。我应该使用什么启动模式等?如果可能的话,我想将 singleTask 用于 ABCD。同样,当在 D 中时,我按下 home 并再次通过 A 图标启动,然后根据启动模式,我没有到达 D(我想要的),但到达 A。DCB 被清除。
我尝试了很多东西,但我就是不明白它是如何工作的。我似乎没有得到相应的行为。
getLaunchIntentForPackage
只是给你包的主要活动。在您的第一个应用程序中,我猜它是A
。因此,如果您尝试从第二个应用程序 ( X
-> Y
) 启动它,它将启动A
而不是D
哪个是不同的活动。所以你没有得到D
。
当您按下主页并单击第一个应用程序的启动图标时,如果已经有一个任务,它将被带到前台。看起来A
,应用程序的主要活动 ( A
) 被调用- 而不是堆栈顶部活动D
。并且B->CD 被清除,因为您可能正在使用singleTask
Activity 的启动模式A
,它试图将您带回现有任务中的活动。
所以你观察到的都是预期的。启动模式是按活动定义的,而不是按应用程序/包级别定义的。
因此,要从Y
toD
开始,您需要D
使用设置为 的意图标志开始活动FLAG_ACTIVITY_NEW_TASK
,这将确保您到达现有的D
,这已经在您的第一个任务(A->B->C->D)中处于首位
要从主屏幕(启动器图标)执行相同操作,您可能需要尝试以下SingleTask
mode选项,因为您想保留现有堆栈 (A->B->CD) ,并且只想获取D
; 引用链接:
"+ For launchMode=singleTask if there is an intent_filter in the
manifest the task stack is always cleared after returning to Home and
re-launching (returns to main activity instead of last activity).
+ For launchMode=standard re-launch from Home instead returns to last
activity in task (as expected).
+ If there is no intent_filter listed then even with
launchMode=singleTask re-launch from Home returns to the last activity
in the task"
singleTask
意图标志(例如:FLAG_ACTIVITY_NEW_TASK )在模式下启动它。意图标志覆盖清单启动模式,请参见此处