ClassNotFoundException при использовании пользовательских Parcelable

Я использую настраиваемый 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)

Итак, есть ли какой-либо путь вокруг этой проблемы? Любая помощь будет оценена.

Спасибо

Ответ 1

Поместите com.company.project.MyParcelable в фактическое приложение, вместо того, чтобы делать все игры, которые вы играете с загрузчиками классов. Затем он должен быть доступен как отправителю, так и получателю Intent.

Ответ 2

Кажется, что вы столкнулись с проблемой, описанной здесь: 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);