2016-10-21 3 views
0

Я всегда получаю нуль, при получении parcelable объекта из RemoteViewsService в onReceive() методе AppWidgetProvider.parcelable объект поставщик appwidget всегда возвращает нуль

Я пробовал, проезжая string и int, и он отлично работал, но не был включен parcelable.

StackWidgetProvider.java расширяет AppWidgetProvider

@Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(INTENT_ACTION)){ 

      Artwork artwork = (Artwork) intent.getParcelableExtra(EXTRA_ART); 
      Log.e("Intent","->"+artwork.getTitle()); 
      Intent showArtDetail = new Intent(context, ArtsDetailsActivity.class); 
      showArtDetail.putExtra(ArtsDetailsActivity.TAG_ARTWORK, artwork); 
      showArtDetail.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(showArtDetail); 
     } 

     super.onReceive(context, intent); 
    } 

StackWidgetService.java расширяет RemoteServiceView

Bundle extras = new Bundle(); 
extras.putParcelable(StackWidgetProvider.EXTRA_ART, artwork); 

Intent fillInIntent = new Intent(); 
fillInIntent.putExtras(extras); 
remoteViews.setOnClickFillInIntent(R.id.widget_item, fillInIntent); 
+1

Если бы мне пришлось угадать, вы бежите в другое место [где пользовательские «Parcelable» реализации не работают] (https://commonsware.com/blog/2016/07/22 /be-careful-where-you-use-custom-parcelables.html). – CommonsWare

+0

@CommonsВы решаете мою проблему. Не стесняйтесь публиковать его в качестве ответа. –

ответ

2

пользовательский класс Parcelable может использоваться только процессами, которые содержат этот класс. Обычно это означает, что пользовательский класс Parcelable работает только с собственным процессом приложения.

Следствием этого является то, что there are many places where custom Parcelable implementations do not work, потому что некоторые другие процесс пытается работать с Parcelable и не с ClassNotFoundException (или эквивалент).

Один такого узор, когда вы поставите обычай Parcelable как дополнительные в Intent завернутого в PendingIntent, а какой-то другой процесс хочет заполнить этот Intent с дополнительными статистами. По пути другой процесс будет нуждаться в доступе к полному Bundle дополнительных услуг в Intent, и это не удастся, потому что другому процессу не хватает пользовательских Parcelable. В этом случае на главном экране не будет вашего пользовательского Parcelable.

Либо:

  • Пропустить этот обычай Parcelable прямо или

  • Пропустить обычай Parcelable но поставить некоторые идентификатор в качестве дополнительного, который позволит вам получить, что Parcelable назад позже (например, , из кеша или, если необходимо, перезагрузиться из хранилища данных) или

  • Сначала преобразуйте его в какой-либо другой формат, например converting it to a byte[], перед putt используя его в дополнительном

Смежные вопросы