如何在完成后从最近的任务中删除taskAffinity的singleTask活动?

假设我们有两个活动。

A – 主要活动,即“启用家庭启动器”(适当的意图filter等)

B – 具有singleTask规范的任务根活动(此活动只能有一个实例)和自定义taskAffinity(用于区分主要任务根)。

假设B代表一个任务,只有当它没有完成时才有效 – 返回它或者在完成它之后从最近的任务再次启动它不是一个选项。

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

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

怎么实现呢? (对不起,我的英语不好)

    标准答案

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

    最近的任务专门为了方便用户使用,允许他们回到他们一直使用的任何应用程序,无论应用程序是否正在运行。 然而,有好消息。 此过程不会让您的应用程序保持活力! 它只是一个指向您的包的图标。

    不幸的是,这意味着如果你的应用程序仍然在运行,那么还会继续保持其运行。

    非标准答案

    可以通过在运行时编辑包属性(与在java代码中启用/禁用组件的方式相同)。 这是非常气馁的,因为Recent Tasks是Android核心平台的可用性function。 这需要一些研究。

    有点晚了,但这仍然是谷歌的最高点。 请参阅此答案以获得可能的解决方案。

    在您的情况下,您将不得不:

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