如何在单一任务活动完成后从最近任务中移除具有任务亲和性的单一任务活动?

10
假设我们有两个活动。

A-主要活动,即“home launcher enabled”(适当的意图过滤器等)

B-带有singleTask规范的任务根活动(只能有一个此类活动的实例),并带有自定义taskAffinity(以将其与主任务根区分开)。
假设B表示一个任务,该任务仅在未完成时有效——返回它或从最近的任务开始它是不可行的。
在某个时间点上,A启动B以开始一个新任务。目标是在用户完成B时从最近的任务列表中删除B。用户可以从B导航到其他任务(使用home long press),然后再次导航回B,只要B没有完成。从launcher启动A不会将B带到前台,因为它们具有不同的任务关联性。
Android将B识别为任务的根,因此即使它已完成,B也会显示在最近的任务列表中,并且用户始终可以返回到它。将B移动到与A相同的任务中不是解决方案,因为在运行B的时间内,用户应该能够在A和B任务之间切换。将excludeFromRecents添加到B的清单中完全从最近的任务列表中删除它,这也是不好的解决方案。
如何实现?(对不起我的坏英语)

在任务完成后在 onResume() 中调用 finish() 不正确吗? - pawelzieba
但它仍然停留在最近任务列表中。 - Michael P
@MichaelP 你想让它永远不出现在最近任务中吗?还是只是在完成后消失? - Fuzzical Logic
@FuzzicalLogic 当完成时应该消失。 - Michael P
@MichaelP 你是如何解决你的问题的? - Erum
2个回答

3

标准答案

很抱歉告诉您一个不好的消息,使用标准方法无法实现这个功能,除非覆盖应用程序的工作方式。即使这样做,它也只在您的应用程序运行时有效。此外,这将需要具有专用ROM的已root设备,因为您不能以任何方式覆盖Home键的功能。您只能响应onNewIntent(),但如果长按Home键,则不会触发该方法。

最近的任务是专门为了方便用户快速返回他们正在使用的应用程序而设计的,无论应用程序是否正在运行。然而,有好消息。这个过程并没有保持您的应用程序处于活动状态!它只是一个指向您的包的图标。

不幸的是,这意味着如果您的应用程序仍在运行,则可能有其他事情使其保持活动状态。

非标准答案

通过在运行时编辑包属性(就像您可以从Java代码中启用/禁用组件一样),这可能是可行的。但是这样做是不被鼓励的,因为最近的任务是Android核心平台的一个可用性功能。这需要进行一些研究。


0

虽然有点晚了,但这仍是谷歌搜索的最高点击率。请参考 this 答案以了解可能的解决方案。

在您的情况下,您需要:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接