42

根据 Android 文档,系统将清除它认为已被用户放弃的任务(完成启动该任务的所有活动):

https://developer.android.com/guide/components/tasks-and-back-stack.html#Clearing

如果用户长时间离开一个任务,系统会清除该任务除根Activity之外的所有Activity。当用户再次返回任务时,仅恢复根活动。系统的行为方式是这样的,因为在很长一段时间后,用户可能已经放弃了他们之前正在做的事情,并且正在返回任务开始新的事情。

https://developer.android.com/guide/topics/manifest/activity-element.html#always

通常,当用户从主屏幕重新选择该任务时,系统会在某些情况下清除任务(从根活动上方的堆栈中删除所有活动)。通常,如果用户在一定时间内(例如 30 分钟)没有访问任务,则会执行此操作。

这种行为可以很容易地在运行 Gingerbread 和更早版本的设备上重现。启动一个应用程序并创建一些回溯历史,然后点击主页按钮并等待半小时。从主屏幕再次启动应用程序,状态已被清除,就好像它正在开始一项新任务一样。完美的。

但是,在运行 ICS 及更高版本的设备上,我似乎根本无法重现此行为,即使在任务在数小时或数天后处于非活动状态后也是如此。当应用程序从主屏幕重新启动时,任务始终处于我离开它的状态。

假设文档是正确的,现代版本的 Android(API 14+)在什么情况下会自动清除任务?

如果行为发生了变化并且文档已过期,那么该alwaysRetainTaskState属性的用途是<activity/>什么?是否已将默认值更改为"true"或现在已弃用此属性?

注意:这里我不是在谈论 Android 的进程生命周期管理,它依赖于设备资源。无论如何,终止进程对用户应该是透明的,并且不会影响任务状态。

4

1 回答 1

42

很好的问题,经过一番深入研究后,答案肯定让我感到惊讶!

快速浏览一下 Android 资源似乎提供了答案。让我们从ActivityManagerService.java回顾 Android 2.2 开始。请注意,在第 186 行附近,定义了一个名为的常量ACTIVITY_INACTIVE_RESET_TIME,它恰好设置为 30 分钟。

// How long until we reset a task when the user returns to it.  Currently
// 30 minutes.
static final long ACTIVITY_INACTIVE_RESET_TIME = 1000*60*30;

进一步查看第resetTaskIfNeededLocked()7021 行周围的方法,您将看到检查此值以确定是否应在启动之前重置任务。

快进到 Android 4.3 源代码,代码已移至从ActivityManagerService调用的 ActivityStack.java 中,但基本结构是相同的。这一次,常量是在第 125 行定义的:

// How long until we reset a task when the user returns to it.  Currently
// disabled.
static final long ACTIVITY_INACTIVE_RESET_TIME = 0;

在第 1973 行附近找到了相同的resetTaskIfNeededLocked()方法,您可以看到现在它会检查值是否大于零,然后再应用相同的超时检查来清除任务状态。但是请注意,此方法仍然检查FLAG_ALWAYS_RETAIN_TASK_STATE,因此此标志仍可用于保护清除状态,但似乎禁用外部检查后,此代码将永远不会执行。

总体而言,这似乎是一个非常有说服力的证据,表明该功能已在 AOSP 中为更高版本的 Android 有效禁用。我没有看到外部方法(通过系统属性等)可以为每个设备重新启用此值,除非制造商要重建代码并在此处添加值……但这并不常见。大多数 ODM 坚持在 XML 中配置属性或他们可以通过覆盖控制的系统属性。

因此,虽然从技术上讲,该功能还没有被“删除”,但在我看来,文档在延迟后自动触发方面不再正确。

于 2013-09-19T18:51:12.403 回答