使用广播接收器在应用程序之间发送可序列化对象

Sim*_*n k 3 java android

我试图通过广播接收器将一个实现“可序列化”的对象从一个应用程序发送到另一个应用程序。

我想发送一个类,如:

public class MyObject implements Serializable{
    //basic properties
}
Run Code Online (Sandbox Code Playgroud)

在应用程序 A 中,我这样做:

Intent i = new Intent("myApplication.string");
Bundle b = new Bundle();
b.putSerializable("myclass",obj);
i.putExtras(b);
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

当我调试这个时,我可以验证对象是否正确存储在意图中的包中。

在应用程序 B 中,我这样做:

显现

 <receiver
        android:name="com.example.myapplication.myreceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="myApplication.string"/>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

广播接收器

@Override
public void onReceive(Context context, Intent intent) {
    try{
        Bundle b = intent.getExtras();
        MyObject s = (MyObject)b.getSerializable("myclass");
    }catch (Exception e){
        Log.d(TAG,e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序 B 中,意图不保存它在应用程序 A 中所做的数据。

当我尝试投射数据时,它会抛出:

Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.myApplication.MyObject)
Run Code Online (Sandbox Code Playgroud)

我已经在两个应用程序中复制了类实现,以便它们匹配。

在此处输入图片说明

在应用程序 A 中,所有数据都在 Intent.extras 的 mMap 属性中 - 但在应用程序 B 中它是空的。

任何人都可以帮助我理解这一点吗?

谢谢。

Com*_*are 6

我试图通过广播接收器将一个实现“可序列化”的对象从一个应用程序发送到另一个应用程序。

这不是一个好主意。它要求两个应用程序对该 Java 类具有相同的类定义,或至少一个兼容。由于应用程序可能不会同时更新,因此您可能会遇到以下情况:发送方的 Java 类版本比接收方的版本更新,这可能会导致反序列化异常。

在应用程序 A 中,我这样做:

这不是一个好主意。您没有将数据发送到其他应用程序。您正在将数据发送到任何愿意收听此广播的应用程序,包括任何可能想要监视您的输出的应用程序。

在应用程序 B 中,我这样做:

这不是一个好主意。任何应用程序都可以向该应用程序发送广播,以欺骗消息或试图导致应用程序崩溃。在 Android 8.0+ 上,您无论如何都不会收到广播。

我已经在两个应用程序中复制了类实现,以便它们匹配。

也许您的操作方式存在问题,因为错误消息似乎与您的评估不一致。

我将从摆脱Serializable. 仅将内容放入保证所有访问这些附加程序的各方都能正确识别的附加程序中。因此,请使用简单的原语或Bundle, 或其他框架类,而不是自定义SerializableParcelable实现。然后,看看您的更普通的附加功能是否正在从应用程序制作到应用程序。

然后,做好进程间通信:

  • 使用显式Intent(带有ComponentName),而不是隐式Intent(带有操作字符串),以便“广播”仅在两方之间进行,并且可以绕过 Android 8.0+ 隐式广播限制

  • 实施权限(例如,android:permission在 上<receiver>)或执行签名检查以确保双方是您认为的身份