AlarmManager 启动的 Intents 会在运行之间保留其对象吗?
Will Intents started by AlarmManager retain its objects between runs?
我有一个使用 AlarmManager 定期执行任务的应用程序。从 AlarmManager 调用的 Intent,我访问应用程序以访问共享数据。
Application foo = getApplication();
然后我使用 foo 对象来读取和写入数据。此应用程序的大部分生命周期处于静止状态,偶尔会被唤醒。
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
对象可能都是一个新实例。
我有一个使用 AlarmManager 定期执行任务的应用程序。从 AlarmManager 调用的 Intent,我访问应用程序以访问共享数据。
Application foo = getApplication();
然后我使用 foo 对象来读取和写入数据。此应用程序的大部分生命周期处于静止状态,偶尔会被唤醒。
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
对象可能都是一个新实例。