使用 startActivityForResult 方法启动时,singleTask 应用程序不会重用最近应用程序中已经存在的任务

Posted

技术标签:

【中文标题】使用 startActivityForResult 方法启动时,singleTask 应用程序不会重用最近应用程序中已经存在的任务【英文标题】:singleTask app doesn't reuse the Task already present in recent apps when started with startActivityForResult method 【发布时间】:2021-06-11 08:24:17 【问题描述】:

我有两个安卓应用,我们称它们为应用 A 和应用 B。 在应用程序 A 中,我按如下方式创建共享意图:shareIntent=Intent.createChooser(sendIntent, null); // sendIntent contains data to share. 这将用于将数据传递给应用 B。 应用 B 的 MainActivity(它唯一的 Activity)配置为具有launchMode="singleTask"

行为 1: 如果从应用程序 A 我使用 startActivity(shareIntent) 并且应用程序 B 在后台,它会进入前台并使用 onNewIntent 方法处理意图。如果应用 B 不在后台,它会为应用 B 启动一个新任务,其初始意图设置为从应用 A 传递的 sendIntent。

行为 2: 如果从应用程序AI使用startActivityForResult(shareIntent, SUCCESS_CODE),不管应用程序B是否在后台,它都会重新启动,而且应用程序B的MainActivity被启动并推送到应用程序A的backStack,它没有从一个单独的任务开始,之后我有 2 个应用 B 的 MainActivity,一个我保留在后台,一个在应用 A 中启动。

为什么startActivityForResult 会导致行为 2? 作为无法控制应用 A 如何启动它以始终显示行为 1 的应用 B 的开发人员,可以做些什么?

【问题讨论】:

【参考方案1】:

如果Activity 的启动模式为singleTasksingleInstance,则不能使用startActivityForResult() 启动Activity。原因是startActivityForResult() 要求目标Activity(i:正在启动的那个)在与预期结果的Activity 相同的任务中运行

通常,如果您尝试启动 Activity 并且声明 Activity 的启动模式为 singleTasksingleInstanceandroid 会自动将 Intent.FLAG_ACTIVITY_NEW_TASK 添加到 Intent 并确保目标 @ 987654335@ 在单独的任务中启动。

如果开发人员希望他的Activity 将使用startActivityForResult() 启动,并且他将Activity 编码为实际返回结果,那么用singleTask 启动模式声明这个Activity 绝对没有意义或singleInstance

这种行为不是你说的你看到的,但是很明显startActivityForResult()的合约和singleTask的启动模式有冲突。

【讨论】:

以上是关于使用 startActivityForResult 方法启动时,singleTask 应用程序不会重用最近应用程序中已经存在的任务的主要内容,如果未能解决你的问题,请参考以下文章

Android------startActivityForResult

startActivityForResult详解

startActivityForResult和setResult详解

Fragment的startActivityForResult和Activity的startActivityForResult的区别

如何取消从 startActivityForResult 调用的 Intent

startActivity startActivityForResult 广播的使用