在Broadcast接收器中保存数据

时间:2010-07-02 01:20:59

标签: android broadcastreceiver

我想在广播接收器中维护一个哈希表。如果我理解BroadcastReceiver的生命周期,它可能会被杀死,消灭我的成员变量。从BroadcastReceiver中之前的onReceive运行中检索哈希表的理想策略是什么?

5 个答案:

答案 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];
//...
}