Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用广播接收器在应用程序之间发送可序列化对象_Java_Android - Fatal编程技术网

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)包没有通过。。然而,你指出了错误的做法,这是对的:)