1

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

4

5 回答 5

14

有两种使用 a 的方法BroadcastReceiver,你没有指明你使用的是哪一种。

一个用于由其他组件注册的接收器 - 例如Activity- via registerReceiver()。此接收器将在其注册后一直存在,因此其数据可能会持续多个onReceive()呼叫。注册接收者的组件将负责持久化数据。

另一种是在清单中注册您的接收器。根据 cdonner 的回答中引用的段落,这些将在一个onReceive()电话后消失。您的接收器需要将其数据本身保存到数据库、平面文件或其他任何东西中。

于 2010-07-02T06:33:56.647 回答
2

一种可能的解决方案是将此地图设为静态。这对于清单中注册的接收器来说似乎没问题,因为一次只有一个接收器。

static HashMap<String> hashMap;
static {
    hashMap.put("key1","string1");
}

可以使用相同的技巧来注册 Handler 以接收来自 Receiver 的反馈。

于 2011-12-19T15:20:08.697 回答
0

来自 Android 参考:

BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。

听起来你想做的事不会奏效。注册接收者的 Activitivy 必须处理这个问题,或者您可以将哈希表保存到数据库中。

于 2010-07-02T01:31:13.557 回答
0

您最好的策略是使用数据库将数据存储在表中,而不是任何类型的内存映射。

这样,即使用户关闭然后再次打开手机也没关系,您之前通话的数据仍然可用。

于 2010-07-02T06:38:11.307 回答
0

将数据向下转换为 Object 类,然后向上转换为所需的类对象:-)


public void onReceive(Context context, Intent intent) {
HashMap map = (HashMap) bundle.get("KEY");
Object[] data=map.get(mapKey);
XXXX xxxx=data[0];
//...
}
于 2011-01-12T10:02:01.247 回答