现代版本的 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 中是否会发生自动任务清除? 的相关文章

  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 为什么将函数参数声明为最终的?

    我目前正在阅读 Sams 出版的 24 小时自学 Android 应用程序开发 一书 我对 Java Android 或其他方面还比较陌生 我对 ActionScript 3 有非常扎实的背景 它与 Java 有足够的相似之处 因此该语言本
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Android - 将 ImageView 保存到具有全分辨率图像的文件

    我将图像放入 ImageView 中 并实现了多点触控来调整 ImageView 中的图像大小和移动图像 现在我需要将调整大小的图像保存到图像文件中 我已经尝试过 getDrawingCache 但该图像具有 ImageView 的大小 我
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index

随机推荐