我有一个使用 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
类的一个实例,只要
- 运行此应用的进程仍然存在。
- 垃圾收集器不会标记和清除应用程序堆上的对象。
当进程被终止时,内核会回收内存,您的 foo
对象将消失。如果您的应用长时间退回到后台,foo
对象将不再在范围内,并将由垃圾收集器以正常方式处理。
每次 AlarmManager
创建您的 Service
的新实例时,都会生成一个运行您的应用程序的新进程(如果该应用程序尚未运行)并且 Service
从此进程中运行。只要包含进程处于 Activity 状态并且它在堆上具有有效引用,foo
对象就会保留在范围内。
作为开发人员,您应该始终假设在Service
的不同运行之间,包含您的应用程序的进程将被终止,或GC 将标记并清除通过你的应用程序堆。这是最有可能发生的情况,您无法控制它。所以你的问题的答案是 foo
对象可能会在每次你的 Service
运行时成为一个新实例。
关于java - AlarmManager 启动的 Intents 会在运行之间保留其对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571244/