BroadcastReceiver 生命周期——静态变量
Posted
技术标签:
【中文标题】BroadcastReceiver 生命周期——静态变量【英文标题】:BroadcastReceiver Life Cycle -- Static Variables 【发布时间】:2011-09-12 01:25:51 【问题描述】:我有一个 BroadcastReceiver 类。我声明了一些静态变量,其值在 onReceive() 方法中更新。据我所知,静态变量将在 onReceive 调用中保持其值。当我失去这些值时是否有可能(比如我的类将被卸载并重置静态变量)?这些基本上是我需要用于多个 onReceive 调用的一些临时变量。
【问题讨论】:
【参考方案1】:来自BroadcastReceiver Lifecycle的文档...
BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。
这不会使静态变量的使用变得实用,因为系统会快速清理事物。我会尝试通过调用来使用SharedPreferences
...
context.getSharedPreferences("MyReceiver", MODE_PRIVATE)
...在接收者的onReceive(...)
方法中(将"MyReceiver"
替换为对您的应用有意义的名称)。
【讨论】:
但是静态变量是类级别的变量,当对象销毁时不应该清理。如果我错了,请纠正我。我知道getSharedPreferences(),但只是想使用静态变量,因为有时我需要在我的工作完成后清除这些变量并且我不希望它们仍然存在于SharedPreferences中。最后如果可以的话通过变量实现然后我不想使用 SharedPreferences。如果不能,那么我肯定会选择 SharedPreferences。 @Sush:“但是静态变量是类级别的变量,在对象销毁时不应该被清除。” - 那么当该类的最后一个实例被销毁时,类变量“存在”在哪里?他们不只是漂浮在网络空间中等待该类的另一个实例出现。正如文档引用中所解释的,当onReceive(...)
退出时,“系统认为对象已完成”。基本上你不能保证BroadcastRecever
对象是否/何时会被GC'd。至于SharedPreferences
,您可以在不再需要时简单地“清除”它们。
@MisterSquonk:我同意 SharedPreferences 可以完成这项工作。但我强烈不同意,一旦类的最后一个实例被销毁,静态变量就会被销毁。静态变量在类加载到内存时被初始化,即当应用程序启动并停留在内存中,直到类在内存中。它不依赖对象生存。
@Sush:好的,同意 WRT 静态变量在类的最后一个实例被销毁后不会被销毁,我的措辞很糟糕。我会改写事情 - 一旦 BroadcastReceiver 退出 onReceive() 并且可能是 GC'd,如果它是整个应用程序的最后一个活动组件,则应用程序本身可能成为 android 目标的危险增加如果设备资源不足,操作系统将终止。如果发生这种情况,那么您将丢失当前值,因为下次接收器被“触发”时,应用程序将被重新创建/重新初始化。但是 SharedPreferences 仍然存在。
@MisterSquonk:感谢您耐心让我理解。我明白了这个想法。再次感谢..【参考方案2】:
或者你当然可以在你的活动类中声明静态变量。
【讨论】:
是的,我可以。但是在 BroadcastReceiver 中声明静态变量有问题吗? 在 Activity、BroadcastReceiver 或类中声明静态变量并不重要。静态变量的行为相同。以上是关于BroadcastReceiver 生命周期——静态变量的主要内容,如果未能解决你的问题,请参考以下文章
Android BroadcastReceiver广播:基本使用
BroadcastReceiver 使用goAsync 执行异步操作