10

假设我们有两个活动。

A - 主要活动,即“启用主页启动器”(适当的意图过滤器等)

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

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

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

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

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

4

2 回答 2

3

标准答案

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

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

不幸的是,这意味着如果您的应用程序仍在运行,那么还有其他事情正在保持它运行。

非标准答案

可以通过在运行时编辑包属性来实现(与您可以从 java 代码启用/禁用组件的方式非常相似)。这是非常不鼓励的,因为最近的任务是 Android 核心平台的一个可用性特性。这需要一些研究。

于 2012-06-11T08:11:03.843 回答
0

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

在您的情况下,您将必须:

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