在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来使用它。这是正确的做法吗?或者有更简单的方法吗?
答案 0 :(得分:2)
您希望putExtra(String name, Serializable s)
版本具有Serializable。但是,List
是一个不扩展Serializable
的接口。尝试将其声明为ArrayList
。
答案 1 :(得分:0)
我曾经遇到过一些问题。我想以一种丑陋的方式解决它,你可以把它作为参考。
我将Map
放入全局单例对象中,Map
的键为String
,Map
将保留我想要传递的对象{{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的组件必须在同一个进程中,只有同一进程中的类才能在堆中共享数据。