Ответ 1
Поместите com.company.project.MyParcelable
в фактическое приложение, вместо того, чтобы делать все игры, которые вы играете с загрузчиками классов. Затем он должен быть доступен как отправителю, так и получателю Intent
.
Я использую настраиваемый Parcelable для переноса некоторых данных в BroadcastReceiver. Вот что я делаю:
Я регистрирую свое намерение и устанавливаю дополнительный 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)
Итак, есть ли какой-либо путь вокруг этой проблемы? Любая помощь будет оценена.
Спасибо
Поместите com.company.project.MyParcelable
в фактическое приложение, вместо того, чтобы делать все игры, которые вы играете с загрузчиками классов. Затем он должен быть доступен как отправителю, так и получателю Intent
.
Кажется, что вы столкнулись с проблемой, описанной здесь: 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);
В Android также есть ошибка, которая может объяснить эту проблему, если вы попытаетесь передать намерение другому намерению: https://code.google.com/p/android/issues/detail?id=179480&thanks=179480&ts=1436464704