Java 使用广播接收器在应用程序之间发送可序列化对象
我试图通过广播接收器将实现“可序列化”的对象从一个应用程序发送到另一个应用程序 我想发送一个类,如:Java 使用广播接收器在应用程序之间发送可序列化对象,java,android,Java,Android,我试图通过广播接收器将实现“可序列化”的对象从一个应用程序发送到另一个应用程序 我想发送一个类,如: public class MyObject implements Serializable{ //basic properties } 在应用程序A中,我执行以下操作: Intent i = new Intent("myApplication.string"); Bundle b = new Bundle(); b.putSerializable("myclass",obj); i.p
public class MyObject implements Serializable{
//basic properties
}
在应用程序A中,我执行以下操作:
Intent i = new Intent("myApplication.string");
Bundle b = new Bundle();
b.putSerializable("myclass",obj);
i.putExtras(b);
sendBroadcast(i);
当我调试它时,我可以验证对象是否正确地存储在intent中的bundle中
在应用程序B中,我执行以下操作:
Intent i = new Intent("myApplication.string");
Bundle b = new Bundle();
b.putSerializable("myclass",obj);
i.putExtras(b);
sendBroadcast(i);
清单
<receiver
android:name="com.example.myapplication.myreceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="myApplication.string"/>
</intent-filter>
</receiver>
在应用程序B中,意图不包含应用程序A中的数据
当我尝试转换数据时,它会抛出一个:
Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.myApplication.MyObject)
我已经在两个应用程序中复制了类实现,以便它们匹配
在应用程序A中,所有数据都在Intent.extras的mMap属性中,但在应用程序B中为空
有人能帮我理解吗
谢谢。MyObject应该实现可打包,而不是可序列化 我试图通过广播接收器将实现“可序列化”的对象从一个应用程序发送到另一个应用程序 这不是一个好主意。它要求两个应用程序对该Java类具有相同的类定义,或者至少有一个兼容的类定义。由于应用程序可能不会同时更新,因此您可能会遇到这样的情况:发送方的Java类版本比接收方的Java类版本更新,这可能会导致反序列化异常 在应用程序A中,我执行以下操作:
Intent i = new Intent("myApplication.string");
Bundle b = new Bundle();
b.putSerializable("myclass",obj);
i.putExtras(b);
sendBroadcast(i);
这不是一个好主意。您没有将数据发送到其他应用程序。您正在将数据发送到任何想要收听此广播的应用程序,包括任何想要监视您的输出的应用程序
在应用程序B中,我执行以下操作:
Intent i = new Intent("myApplication.string");
Bundle b = new Bundle();
b.putSerializable("myclass",obj);
i.putExtras(b);
sendBroadcast(i);
这不是一个好主意。任何应用都可以向此应用发送广播,以欺骗消息或试图导致应用崩溃。在Android 8.0+上,您无论如何都不会收到广播
我已经在两个应用程序中复制了类实现,以便它们匹配
也许您是如何做到这一点的,因为错误消息似乎与您的评估不一致
我首先要摆脱可序列化的。仅将物品放入额外物品中,并确保访问这些额外物品的各方正确识别这些物品。因此,请使用简单的原语或Bundle
或其他框架类,而不是自定义Serializable
或Parcelable
实现。然后,看看你那些更普通的临时演员是否能在一个应用程序之间成功
然后,更好地进行进程间通信:
- 使用显式的
意图
(一个带有组件名
),而不是隐式的意图
(一个带有动作字符串),这样“广播”只在双方之间进行,并围绕安卓8.0+隐式广播限制工作
- 实施权限(例如,
上的android:permission
)或执行签名检查,以确保双方都是您认为的人
为什么需要这样做?您可以在活动之间发送可序列化对象,而不会出现任何问题。它应该可以正常工作,但如果不能正常工作,则可能是由嵌套对象引起的。如果您直接实现Parcelable,那么就不需要任何不同的实现,您的打包类将知道如何打包以及如何再次取消打包…好的方面。。。事实上,我确实试着把额外的(“测试”,“测试”);放在意图中,看看是否通过了,但没有。他们的推断与你指出的相同,并建议在两个应用程序之间共享一个库,我会尝试。@Simonk:“事实上,我只是试着把额外的(“测试”,“测试”);放在意图中,看看是否通过了,但没有”——好的,真奇怪。我无法解释。结果是我正在创建的包把事情搞砸了。通过直接将数据添加为putExtra(“key”,val),它起了作用。我不能告诉你为什么,但是我创建的附加为putExtras(bundle)包没有通过。。然而,你指出了错误的做法,这是对的:)