![](/img/trans.png)
[英]Android - Sending/Receiving POJOs across Applications via Broadcast Receiver
[英]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
或其他框架類,而不是自定義Serializable
或Parcelable
實現。 然后,查看您更普通的附加功能是否在各個應用程序之間實現。
然后,更好地進行進程間通信:
使用顯式Intent
(一個具有ComponentName
),而不是隱式Intent
(一個具有操作字符串的字符串),以便“廣播”僅在兩方之間進行,並且可以解決Android 8.0+隱式廣播的限制
實現權限(例如, <receiver>
上的android:permission
)或執行簽名檢查以確保雙方都是您認為的對方
MyObject應該實現Parcelable,而不是Serializable ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.