2010-02-21 97 views
10

我使用自定義Parcelable將一些數據攜帶到BroadcastReceiver。這是我做的:使用自定義Parcelable時發生ClassNotFoundException

我註冊了我的意圖,並設置了額外的Parcelable以及一個額外的類加載器(intent.setExtraClassLoader(..))。接下來,我通過AlarmManager安排廣播的執行。

因此,當AlarmManager觸發它時,它會查看我的包裹,因爲它不使用提供的類加載器(因爲它接縫)而無法處理它。

當Inten.fillIn將意圖複製到新的類時,我認爲類加載器會丟失(請參閱堆棧跟蹤)。

02-21 21:09:25.214: WARN/Intent(52): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.project.MyParcelable 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readParcelable(Parcel.java:1822) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readValue(Parcel.java:1713) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Parcel.readMapInternal(Parcel.java:1947) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Bundle.unparcel(Bundle.java:169) 
02-21 21:09:25.214: WARN/Intent(52):  at android.os.Bundle.putAll(Bundle.java:242) 
02-21 21:09:25.214: WARN/Intent(52):  at android.content.Intent.fillIn(Intent.java:4530) 
02-21 21:09:25.214: WARN/Intent(52):  at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:185) 
02-21 21:09:25.214: WARN/Intent(52):  at android.app.PendingIntent.send(PendingIntent.java:400) 
02-21 21:09:25.214: WARN/Intent(52):  at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:636) 

那麼圍繞這個問題有什麼辦法嗎?任何幫助,將不勝感激。

感謝

回答

7

在實際應用中把com.company.project.MyParcelable,而不是做什麼遊戲,你在玩類加載器。然後,它應該可以從Intent的發件人和收件人處獲得。

+0

的AlarmManager當接收到一個BOOT_COMPLETED行動計劃。所以我不會在我的應用程序中啓動這個意圖。 有沒有更好的方法來處理這種情況? – Moritz 2010-02-22 20:06:05

+4

哦!我懂了。我沒有注意到在堆棧跟蹤中。關閉袖口,看起來你不能使用具有PendingIntent的自定義'Parcelable',這有點臭。您可能需要以其他方式序列化您的對象(例如,「Bundle」到「String」),而不是使用「Parcelable」。 – CommonsWare 2010-02-22 20:16:52

+0

是通過一個額外準備好的對象管道數據是一種方式。奇怪的是,我得到了提到的異常,但我的數據對象實際上被轉移。所以它確實有效,但是總是讓這個例外感到困惑和威脅。 – Moritz 2010-02-22 23:06:27

6

看來你面對這裏描述的問題:https://code.google.com/p/android/issues/detail?id=6822

有一個在該鏈接下一個註釋中描述的解決方法:把你的自定義Parcelable爲附加Bundle。由於Bundle內部消息在需要時纔會觸及,因此可以將這樣的Intent發送給您的應用,因爲沒有人會嘗試在您的應用之外解組您的課程。

Bundle hackBundle = new Bundle(); 
    hackBundle.put("key", myParcelable); 
    intent.putExtra("bundleKey", hackBundle); 
+0

密鑰包有一個'規則',密鑰意圖是不同的? – andresmafra 2014-04-22 10:48:14

+0

nope,這不是強制性的。 – 2014-04-22 17:14:26

+0

對我來說,它沒有工作。我在這裏和6822 android問題討論中嘗試了每個評論。還有另一個WA? – andresmafra 2014-04-22 23:10:36

相關問題