微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从带有单个任务活动的应用程序图标启动时,任务堆栈被重置为 root;为什么?

如何解决从带有单个任务活动的应用程序图标启动时,任务堆栈被重置为 root;为什么?

场景:

我有 MainActivity,它有 <intent-filter>MAINLAUNCHER。根据所需的设计,此活动设置为具有 launchMode="singleTask"

我在某个路径中导航:MainActivity -> Activity A -> Activity B,它们都被添加到任务堆栈中。

场景 A:我将应用设为后台,从“最近使用的应用”部分恢复它。任务堆栈已正确恢复,例如B > A > Main

wm_task_moved: [269,2147483647]
am_focused_stack: [0,234,moveTaskToFront findTaskToMovetoFront]
wm_task_moved: [269,2147483647]
am_on_top_resumed_lost_called: [0,com.google.android.apps.nexuslauncher.NexusLauncherActivity,topStateChangedWhenResumed]
correct behavior --> am_set_resumed_activity: [0,test.ActivityB,moveTaskToFront findTaskToMovetoFront]
am_pause_activity: [0,60517111,com.google.android.apps.nexuslauncher/.NexusLauncherActivity,userLeaving=true]
am_task_to_front: [0,269]
am_on_paused_called: [0,performPause]
am_set_resumed_activity: [0,resumetopActivityInnerLocked]
am_add_to_stopping: [0,makeInvisible]
am_resume_activity: [0,29773184,269,test.ActivityA]
sysui_multi_action: [757,803,799,window_time_0,802,6]
am_on_restart_called: [0,performRestartActivity]
am_on_start_called: [0,handleStartActivity]
am_on_resume_called: [0,RESUME_ACTIVITY]
am_on_top_resumed_gained_called: [0,topWhenResuming]
sysui_multi_action: [319,30,321,25,322,123,325,110814,757,761,758,9,759,4,806,test.package,871,904,905,1320,12,1321,1]
am_stop_activity: [0,com.google.android.apps.nexuslauncher/.NexusLauncherActivity]
am_on_stop_called: [0,STOP_ACTIVITY_ITEM]

场景B:我再次将应用程序后台运行,这次从启动器图标恢复它;活动以某种方式被标记,并清除任务堆栈,只留下根 MainActivity

incorrect behavior --> am_finish_activity: [0,262811058,test.ActivityA,clear-task-stack]
incorrect behavior --> am_destroy_activity: [0,finish-imm:finishActivityLocked]
incorrect behavior --> am_finish_activity: [0,214943796,finish-imm:finishActivityLocked]
am_new_intent: [0,24608519,test.Main,android.intent.action.MAIN,NULL,268435456]
wm_task_moved: [269,bringingFoundTaskToFront]
wm_task_moved: [269,2147483647]
am_set_resumed_activity: [0,bringingFoundTaskToFront]
am_pause_activity: [0,269]
sysui_multi_action: [757,9]
sysui_multi_action: [757,0]
am_on_top_resumed_lost_called: [0,topStateChangedWhenResumed]
am_on_paused_called: [0,test.Main]
incorrect behavior --> am_on_destroy_called: [0,performDestroy]
sysui_multi_action: [757,0]
incorrect behavior --> am_on_destroy_called: [0,performDestroy]
am_on_restart_called: [0,handleStartActivity]
I am_on_resume_called: [0,topWhenResuming]

场景2的事件日志;从应用程序图标和最近的应用程序启动时,它似乎在 clear-task-stackActivityB 上强行设置 ActivityA

据我所知,如果我将 Activity 声明为 singleTask,当我从应用程序图标重新启动应用程序时,它应该会找到现有的任务堆栈并重新创建它,与 Scenario A 中的相同.我能得出的唯一结论是,从应用程序图标启动应用程序是以某种方式对其进行标记,这会覆盖 singleTask Activity 的某些固有行为并手动重置任务堆栈。

我认为这是一个错误,但如果我错了,请纠正我。 我想弄清楚为什么这两种情况的行为不同,以及如果它是一个错误,我可以如何解决这个问题,或者如果它是预期的行为,则更改我的实现。我已经阅读了关于类似窃听行为的 SO,但它的不同之处在于我没有任何类型的单独启动活动;只是一个 MainActivity,为 MAINLAUNCHER 定义了意图过滤器属性,同时也是一个 singleTask 活动。我的 MainActivity 仍然将自己视为根任务;它只是在我认为不应该清除的时候清除其他任务。

我现在看到的唯一解决方案是将我的 MainActivity 更改为 launchMode="singletop" 并在每次启动时手动标记以避免实例重复,这似乎违背了 {{1} 的目的}} 完全。

感谢任何帮助;谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。