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

Jef*_*elt 41 android

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

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

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

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

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

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

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

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

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

注意:我不是在谈论Android的流程生命周期管理,它将取决于设备资源.杀死进程应该对用户透明,并且不会影响任务状态.

Dev*_*red 41

很棒的问题,经过一些源头潜水的答案肯定让我感到惊讶!

快速浏览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;
Run Code Online (Sandbox Code Playgroud)

再看一下resetTaskIfNeededLocked()7021行周围的方法,你会看到这个值被检查以确定在启动之前是否应该重置任务.

快进到Android 4.3源和代码已被移动到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;
Run Code Online (Sandbox Code Playgroud)

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

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

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