2010-07-02 144 views
1

我想在广播接收器中维护一个哈希表。如果我现在理解BroadcastReceiver的生命周期,它可能会被清除掉我的成员变量。在BroadcastReceiver的前一次运行onReceive中检索散列表的理想策略是什么?将数据保存到广播接收器

回答

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的反馈。

+1

只要您确定系统不会终止进程,它会在接收方返回后执行,如果该进程中没有其他任何活动处于活动状态,则静态工作。 – satur9nine 2012-05-19 02:34:15

+0

谢谢,虽然它可能不是原始问题想要的,但它正是我所需要的。一种缓存数据的方式,所以我只在第一个BroadcastReceiver调用时获得性能。 – domen 2013-11-22 20:32:28