java - AlarmManager 启动的 Intents 会在运行之间保留其对象吗?

标签 java android android-intent android-broadcast android-alarms

我有一个使用 AlarmManager 定期执行任务的应用程序。从 AlarmManager 调用的 Intent,我访问应用程序以访问共享数据。

Application foo = getApplication();

然后我使用 foo 对象来读取和写入数据。此应用的大部分生命周期处于静止状态,偶尔会被唤醒。

根据developer documentation :

When an alarm goes off, the Intent that had been registered for it is broadcast by the system, automatically starting the target application if it is not already running.

但是实例化的 foo 对象会发生什么? (以及其中的所有其他对象都是由 Intent 创建的)它会与之前的迭代相同还是会是一个新的?

最佳答案

foo 对象是 Application 类的一个实例,只要

  • 运行此应用的进程仍然存在。
  • 垃圾收集器不会标记和清除应用程序堆上的对象。

当进程被终止时,内核会回收内存,您的 foo 对象将消失。如果您的应用长时间退回到后台,foo 对象将不再在范围内,并将由垃圾收集器以正常方式处理。

每次 AlarmManager 创建您的 Service 的新实例时,都会生成一个运行您的应用程序的新进程(如果该应用程序尚未运行)并且 Service 从此进程中运行。只要包含进程处于 Activity 状态并且它在堆上具有有效引用,foo 对象就会保留在范围内。

作为开发人员,您应该始终假设在Service 的不同运行之间,包含您的应用程序的进程将被终止,GC 将标记并清除通过你的应用程序堆。这是最有可能发生的情况,您无法控制它。所以你的问题的答案是 foo 对象可能会在每次你的 Service 运行时成为一个新实例。

有关更多信息,请参阅 herehere .

关于java - AlarmManager 启动的 Intents 会在运行之间保留其对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571244/

相关文章:

android - 使用 NDK 为 Android 编译 OpenALPR

android - 如何使用 DPI 缩放因子(float)设置边距(int)

android - float 操作按钮不适用于 ListView

android - ActivityRecognitionResult.hasResult(intent) 在向 Intent 添加额外内容时为 false

java - 二进制文件读取器 byte[] 到字符串的转换出错了?

java - 在java中向上传播错误

java - 如何在 Jboss 6 中动态更改数据源连接 url

java - 通过自动配置作为模块打开附加端口时,应用程序无法启动

android - 打开具有特定相册/文件夹的默认照片应用程序

java - 为什么我的 Android 选项卡不能正常工作?