gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:53:03 25 4
gpt4 key购买 nike

我有一个使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com