完成后,如何使用 taskAffinity 从最近的任务中删除单个任务活动



假设我们有两个活动。

A - 主要活动,即"启用主启动器"(正确的意图过滤器等)

B - 具有单个任务规范(此活动只能有一个实例)和自定义任务亲和力(以区分是否与主任务根)的任务根活动。

假设 B 代表一个任务,该任务仅在未完成时才有效 - 在完成任务后返回该任务或从最近的任务重新开始它不是一种选择。

在某个时间点 - A 启动 B 开始一个新任务。目标是在用户完成 B 时从最近的任务列表中删除 B.用户可以从 B 导航到其他任务(使用主页长按),然后导航回 B,只要它没有完成。从启动器启动 A 不会将 B 带到前台,因为它们具有不同的任务亲和力。

Android 将 B 识别为任务的根,因此即使 B 已完成,它也会显示在最近的任务列表中,并且用户可以随时返回它。将 B 移动到带有 A 的一个任务不是解决方案,因为在 B 运行时 - 用户应该能够在 A 和 B 任务之间切换。将 excludeFromRecents 添加到 B 的清单中会将其从最近的任务列表中完全删除,这也是一个糟糕的解决方案。

如何实现?(对不起,我的英语不好)

标准答案

很抱歉成为坏消息的承载者,但如果不覆盖应用的工作方式,就无法使用标准方法实现此功能。即便如此,它也只能在您的应用程序运行时工作。此外,这样做将需要具有专用ROM的root设备,因为无论如何您都无法覆盖Home按钮的功能。您所能做的就是响应onNewIntent()如果您长按主页按钮就不会触发。

"最近任务"专门用于方便用户使用,以允许他们返回到他们一直在使用的任何应用,无论应用是否正在运行。不过,也有好消息。此过程不会使您的应用程序保持活动状态!它只是一个指向您的包裹的图标。

不幸的是,这意味着如果您的应用程序仍在运行,则会发生其他事情来保持其运行。

非标准答案

这可以通过在运行时编辑包属性来实现(与从 java 代码启用/禁用组件的方式大致相同)。强烈建议不要这样做,因为"近期任务"是 Android 核心平台的可用性功能。这需要一些研究。

有点晚了,但这仍然是谷歌的热门歌曲。请参阅此答案以获取可能的解决方案。

在您的情况下,您必须:

  • 创建一个名为 ExitActivity 的新活动 C,并添加清单标志,如其他答案中所述。
  • 活动 B 在清单中应具有以下属性:android:taskAffinity="com.example.ActivityB" android:allowTaskReparenting="true" android:launchMode="singleTask" android:documentLaunchMode="always"
  • 将 C 上的任务亲和属性设置为与 B 相同
  • 在退出活动中对Intent.addFlags的调用只能是最后三个:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

最新更新