如何在Activity之间传递HashMap<String, Object>类型数据?
Android Activity间传递HashMap<String,Object>崩溃解决方案
崩溃根因
- 发送和接收的序列化类型不匹配:发送时将
HashMap强转为Parcelable存入Intent,接收时调用getSerializableExtra读取,类型不一致触发运行时类型转换异常。 - 强转逻辑不符合类实现规则:
HashMap本身默认实现Serializable接口,并不实现Parcelable接口,发送时的强转操作本身就会触发运行时异常。
修复方案
直接使用Serializable方式传递即可,Firestore返回的标准Map类型内的基础值、Timestamp等官方类型默认都支持序列化,修改代码如下:
发送端修改
public final static String doctorDataKEY = "asLSAD654sdf"; Intent intent = new Intent(this, Activity_Doctor.class); // 改为强转Serializable(HashMap原生支持该接口) intent.putExtra(doctorDataKEY, (Serializable) data); startActivity(intent);
接收端修改
private Map<String, Object> doctorData = new HashMap<>(); final Intent intent = getIntent(); // 增加类型校验和空判断,避免空指针或类型转换异常 Serializable extraData = intent.getSerializableExtra(Activity_Doctor_Login.doctorDataKEY); if (extraData instanceof Map) { doctorData = (Map<String, Object>) extraData; }
兜底兼容方案
如果你的Map中包含自定义JavaBean类型,或遇到序列化失败的情况,可以用JSON中转的方式传递,稳定性更高:
发送端
Gson gson = new Gson(); String dataJson = gson.toJson(data); intent.putExtra(doctorDataKEY, dataJson);
接收端
Gson gson = new Gson(); String dataJson = intent.getStringExtra(Activity_Doctor_Login.doctorDataKEY); if (dataJson != null) { Type mapType = new TypeToken<HashMap<String, Object>>(){}.getType(); doctorData = gson.fromJson(dataJson, mapType); }
注意事项
如果Map中的value包含自定义JavaBean,需要保证该Bean类实现Serializable接口,或在JSON序列化时做好自定义类型适配。
内容的提问来源于stack exchange,提问作者Xin Nian
相关产品推荐
相关产品推荐

