如何正确打包List <hashtable <string,list <string>&gt;&gt;在Intent for broadcast?</hashtable <string,list <string>

时间:2011-07-16 15:40:38

标签: java android android-intent broadcastreceiver

在Android上,我尝试使用自定义Intent和BroadcastListeners发送自定义广播消息。我有一些自定义数据,格式为:

List<Hashtable<String,List<String>>> data;

尝试使用时:

intent.putExtra("mydata", data);

我收到错误:

The method putExtra(String, boolean) in the type Intent is not applicable for the  arguments (String, List<Hashtable<String,List<String>>>)

查看Intent类,有一堆重载putExtra()的公共方法。但是,似乎没有人符合我要发送的数据。

似乎有一个相当通用的方法

putExtra(String name, Bundle value)

但是,我不知道如何将我的数据转换为Bundle来使用它。这是正确的做法吗?或者有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

您希望putExtra(String name, Serializable s)版本具有Seri​​alizable。但是,List是一个不扩展Serializable的接口。尝试将其声明为ArrayList

答案 1 :(得分:0)

我曾经遇到过一些问题。我想以一种丑陋的方式解决它,你可以把它作为参考。

我将Map放入全局单例对象中,Map的键为StringMap将保留我想要传递的对象{{1} }},而不是将对象放入Intent,我将Intent键放入String。在传递意图的Intent(或服务...)中,我从Activity获取密钥,然后从Intent获取我真正关心的对象。

也许这还不够明确,这里是伪代码:

Mao

请注意,由于您将全局地图放在单个对象中,因此您可能希望在完成对象时从public void sendIntent() { Object data; // the object you want to pass through Intent Map<String, Object> globalMap = getMyGlobalMap(); String uid = UUID.randomUUID().toString(); globalMap.put(uid, data); intent.putExtra(EXTRA_OBJECT_UID, uid); } public void receiveIntent() { String uid = intent.getStringExtra(EXTRA_OBJECT_UID); Object data = getMyGlobalMap().get(uid); // Here is your data object. } 中删除该对象,因为只要您的应用程序存在,地图就会存在,你可能不想保留一些无用的东西,让它们留下你宝贵的记忆。

<强>更新
另一个非常重要的事情是,发送Intent的组件和将接收Intent的组件必须在同一个进程中,只有同一进程中的类才能在堆中共享数据。