在现代版本的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

通常,在用户从主屏幕重新select该任务的某些情况下,系统清除任务(从根目录活动之上的堆栈中移除所有活动)。 通常,如果用户在一定的时间内(例如30分钟)未访问任务,则完成此操作。

这种行为可以很容易地在运行姜饼和更早的设备上复制。 启动一个应用程序并创build一些后退历史,然后点击主页button,等待半小时。 再次从主屏幕启动应用程序,状态已被清除,就好像它正在开始一个新的任务。 完善。

但是,在运行ICS和更高版本的设备上,即使任务在几个小时或几天后仍然处于非活动状态,我也无法完全重现此行为。 当从主屏幕重新启动应用程序时,任务总是处于我离开它的状态。

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

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

注意:我不是在谈论Android的stream程生命周期pipe理,这将取决于设备资源。 杀死一个进程对用户来说应该是透明的,不会影响任务状态。

很好的问题,经过一些潜水源的回答,肯定让我感到吃惊!

快速浏览一下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; 

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

快速转发到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行周围find了同样的resetTaskIfNeededLocked()方法,现在可以看到,现在在应用相同的超时检查清除任务状态之前,它检查值是否大于零。 不过请注意,这个方法仍然检查FLAG_ALWAYS_RETAIN_TASK_STATE ,所以这个标志仍然可以用来保护一个状态,但是在外层检查被禁止的情况下,这个代码永远不会被执行。

总的来说,这似乎是非常有说服力的证据,表明该function已经在AOSP中针对Android的更高版本被有效地禁用。 我没有看到外部手段(通过系统属性等),这个值将被重新启用每个设备,除非制造商在这里重新添加一个值的代码…但这是不常见的。 大多数ODM坚持configurationXML或系统属性,他们可以通过覆盖控制属性。

所以在技术上这个function还没有被“删除”,在我看来,这个文档在延迟之后的自动触发方面不再是正确的。