我想在广播接收器中维护一个哈希表。如果我现在理解BroadcastReceiver的生命周期,它可能会被清除掉我的成员变量。在BroadcastReceiver的前一次运行onReceive中检索散列表的理想策略是什么?将数据保存到广播接收器
1
A
回答
12
有两种方法可以使用BroadcastReceiver
,但您没有指出您正在使用哪种方法。
一个用于某个其他组件注册的接收器 - 如Activity
- 通过registerReceiver()
。这个接收器只要它被注册就会活着,所以它的数据可能会持续多于一个onReceive()
的呼叫。注册接收者的组件将负责持久化数据。
另一种是在清单中注册接收器。那些,根据CDONNER答案中的引用段落,将在一个onReceive()
呼叫后消失。您的接收器需要将其数据本身保存到数据库,平面文件或其他任何内容中。
0
从Android参考:
一个BroadcastReceiver目的是仅适用于所述呼叫的持续时间,以的onReceive(上下文,意图)。一旦你的代码从这个函数返回,系统就认为该对象已经完成并且不再处于活动状态。
听起来不像你想做的事会起作用。注册接收者的Actitivy必须处理这个问题,或者您可以将散列表保存到数据库中。
0
您的最佳策略是使用数据库将数据存储在表中,而不是任何类型的内存映射。
这样,用户关闭再重新打开手机并不重要,您之前通话的数据仍然可用。
0
向下转换的数据到对象类,然后向上转换到所需的类对象:-)
public void onReceive(Context context, Intent intent) {
HashMap map = (HashMap) bundle.get("KEY");
Object[] data=map.get(mapKey);
XXXX xxxx=data[0];
//...
}
2
一种可能的解决方案是使此映射是静态的。这对于在清单中注册的Receivers来说似乎很好,因为一次只有一个接收者。
static HashMap<String> hashMap;
static {
hashMap.put("key1","string1");
}
可能会使用相同的技巧来注册Handler以接收来自Receiver的反馈。
只要您确定系统不会终止进程,它会在接收方返回后执行,如果该进程中没有其他任何活动处于活动状态,则静态工作。 – satur9nine 2012-05-19 02:34:15
谢谢,虽然它可能不是原始问题想要的,但它正是我所需要的。一种缓存数据的方式,所以我只在第一个BroadcastReceiver调用时获得性能。 – domen 2013-11-22 20:32:28