广播接收器生命周期 -- 静态变量

9

我有一个BroadcastReceiver类。我声明了一些静态变量,其值在onReceive()方法内更新。据我所知,静态变量会在onReceive调用之间保留其值。是否有可能失去这些值(例如我的类将被卸载并重置静态变量)?这些基本上是我需要为多个onReceive调用可用的一些临时变量。

2个回答

6
BroadcastReceiver 生命周期 的文档中可以看到...
一个 BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统将认为该对象已完成并不再处于活动状态。
这不会使静态变量的使用实际可行,因为系统不会很快清除它们。我建议在接收器的 onReceive(...) 方法中调用 context.getSharedPreferences("MyReceiver", MODE_PRIVATE) (将 "MyReceiver" 替换为您的应用程序中有意义的名称)来尝试使用 SharedPreferences。

1
但是静态变量是类级别的变量,当对象销毁时不应该被清除。如果我错了,请纠正我。我知道getSharedPreferences(),但只想使用静态变量,因为在一段时间后,我需要清除这些变量,一旦我的工作完成,我不希望它们仍然存在于SharedPreferences中。最后,如果可以通过变量实现,我不想使用SharedPreferences。如果不能实现,那么我肯定会选择SharedPreferences。 - Sush
@Sush:“但是静态变量是类级别的变量,不应该在对象销毁时被清除。” - 那么当该类的最后一个实例被销毁时,类变量存在于哪里?它们不会漂浮在网络空间中等待另一个该类的实例出现。正如文档中引用的那样,当onReceive(...)退出时,“系统认为该对象已完成”。基本上,您无法保证BroadcastRecever对象何时被GC'd。至于SharedPreferences,您可以在不再需要时简单地“清除”它们。 - Squonk
3
我同意SharedPreferences可以完成任务。但我强烈反对静态变量在类的最后一个实例被销毁后也会被销毁的说法。静态变量是在类被加载到内存时初始化的,即应用程序启动时,并且会一直留在内存中直到该类从内存中移除。它不依赖于对象的存在。 - Sush
3
@Sush: 好的,关于静态变量在类的最后一个实例被销毁后不会被销毁的问题,我的措辞有误。我会重新措辞——一旦 BroadcastReceiver 在 onReceive() 中退出并可能被垃圾回收,如果它是应用程序作为整体的最后一个活动组件,那么应用程序本身成为 Android 操作系统在设备资源不足时终止的目标的风险就会增加。如果发生这种情况,您将失去当前值,因为下次接收器“触发”时,应用程序将被重新创建/重新初始化。SharedPreferences 会持久存在。 - Squonk
@MisterSquonk:感谢您耐心地让我理解。我明白了这个想法。再次感谢。 - Sush
据我所知,这个引用只适用于在清单中静态声明的BroadcastReceiver。注册了上下文的接收器在拥有的活动被销毁后将不会被调用。 - B-GangsteR

1

当然,你也可以在你的活动类中声明静态变量。


可以的。但是在BroadcastReceiver内部声明静态变量会有问题吗? - Sush
1
在Activity、BroadcastReceiver或类中声明静态变量都没有关系,静态变量的行为是相同的。 - jclova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接