簡體   English   中英

使用廣播接收器在應用程序之間發送可序列化對象

[英]Sending serializable object between applications with broadcast receiver

我試圖通過廣播接收器將實現“可序列化”的對象從一個應用程序發送到另一個應用程序。

我想發送一個像這樣的課程:

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);

當我調試時,我可以驗證對象是否正確存儲在意圖中的捆綁軟件中。

在應用程序B中,我這樣做:

表現

 <receiver
        android:name="com.example.myapplication.myreceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="myApplication.string"/>
        </intent-filter>
    </receiver>

廣播接收器

@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());
    }
}

在應用程序B中,該意圖不保存它在應用程序A中所做的數據。

當我嘗試投射數據時,它拋出:

Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.myApplication.MyObject)

我已經在兩個應用程序中復制了類實現,因此它們匹配。

在此處輸入圖片說明

在應用程序A中,所有數據都在Intent.extras的mMap屬性中使用-但在應用程序B中為空。

誰能幫我理解這一點?

謝謝。

我試圖通過廣播接收器將實現“可序列化”的對象從一個應用程序發送到另一個應用程序。

那不是一個好主意。 它要求兩個應用程序對該Java類具有相同的類定義,或者至少具有一個兼容的類。 由於可能無法同時更新應用程序,因此您可能會遇到發件人具有比收件人新的Java類版本的情況,這可能導致反序列化異常。

在應用程序A中,我這樣做:

那不是一個好主意。 您沒有將數據發送到另一個應用程序。 您正在將數據發送到任何希望收聽此廣播的應用程序,包括任何可能希望監視輸出的應用程序。

在應用程序B中,我這樣做:

那不是一個好主意。 任何應用程序都可以向此應用程序發送廣播,以欺騙消息或試圖導致該應用程序崩潰。 在Android 8.0+上,無論如何您都不會收到廣播。

我已經在兩個應用程序中復制了類實現,因此它們匹配。

這樣做可能存在問題,因為錯誤消息似乎與您的評估不一致。

我將從擺脫Serializable 僅將雜物放入所有訪問這些雜物的各方都可以正確識別的雜物中。 因此,請使用簡單的原語, Bundle或其他框架類,而不是自定義SerializableParcelable實現。 然后,查看您更普通的附加功能是否在各個應用程序之間實現。

然后,更好地進行進程間通信:

  • 使用顯式Intent (一個具有ComponentName ),而不是隱式Intent (一個具有操作字符串的字符串),以便“廣播”僅在兩方之間進行,並且可以解決Android 8.0+隱式廣播的限制

  • 實現權限(例如, <receiver>上的android:permission )或執行簽名檢查以確保雙方都是您認為的對方

MyObject應該實現Parcelable,而不是Serializable ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM