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