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

Will Intents started by AlarmManager retain its objects between runs?

我有一个使用 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 class 的一个实例,只要

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

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

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

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

有关更多信息,请参阅 here and here