现代版本的 Android 中是否会发生自动任务清除?

2024-03-03

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

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

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

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

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

在运行 Gingerbread 及更早版本的设备上可以轻松重现此行为。启动应用程序并创建一些历史记录,然后点击主页按钮并等待半小时。从主屏幕再次启动应用程序,状态已被清除,就像正在启动新任务一样。完美的。

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

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

如果行为发生了变化并且文档已过时,那么这样做的目的是什么alwaysRetainTaskState属性为<activity/>?默认值已更改为"true"或者这个属性现在已被弃用?

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


很好的问题,经过一番深入研究后,答案确实令我惊讶!

快速浏览一下 Android 源代码似乎就能找到答案。让我们首先回顾一下 Android 2.2:ActivityManagerService.java https://android.googlesource.com/platform/frameworks/base/+/refs/heads/froyo-release/services/java/com/android/server/am/ActivityManagerService.java。注意第 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 源代码,代码已移至ActivityStack.java https://android.googlesource.com/platform/frameworks/base/+/jb-mr2.0.0-release/services/java/com/android/server/am/ActivityStack.java这是从 ActivityManagerService 调用的,但基本结构是相同的。这次,常量是在第 125 行左右定义的:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现代版本的 Android 中是否会发生自动任务清除? 的相关文章

随机推荐