我想在广播接收器中维护一个哈希表。如果我目前了解 BroadcastReceiver 的生命周期,它可能会在清除我的成员变量时被杀死。从 BroadcastReceiver 中的上一次 onReceive 运行中检索哈希表的理想策略是什么?
5 回答
有两种使用 a 的方法BroadcastReceiver
,你没有指明你使用的是哪一种。
一个用于由其他组件注册的接收器 - 例如Activity
- via registerReceiver()
。此接收器将在其注册后一直存在,因此其数据可能会持续多个onReceive()
呼叫。注册接收者的组件将负责持久化数据。
另一种是在清单中注册您的接收器。根据 cdonner 的回答中引用的段落,这些将在一个onReceive()
电话后消失。您的接收器需要将其数据本身保存到数据库、平面文件或其他任何东西中。
一种可能的解决方案是将此地图设为静态。这对于清单中注册的接收器来说似乎没问题,因为一次只有一个接收器。
static HashMap<String> hashMap;
static {
hashMap.put("key1","string1");
}
可以使用相同的技巧来注册 Handler 以接收来自 Receiver 的反馈。
来自 Android 参考:
BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。
听起来你想做的事不会奏效。注册接收者的 Activitivy 必须处理这个问题,或者您可以将哈希表保存到数据库中。
您最好的策略是使用数据库将数据存储在表中,而不是任何类型的内存映射。
这样,即使用户关闭然后再次打开手机也没关系,您之前通话的数据仍然可用。
将数据向下转换为 Object 类,然后向上转换为所需的类对象:-)
public void onReceive(Context context, Intent intent) {
HashMap map = (HashMap) bundle.get("KEY");
Object[] data=map.get(mapKey);
XXXX xxxx=data[0];
//...
}