объект, подлежащий передаче, в поставщике виджета приложения всегда возвращает ноль

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

Я попробовал это, пройдя 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);

person Vipul Asri    schedule 21.10.2016    source источник
comment
Если бы мне пришлось угадывать, вы попали в другое место где собственные Parcelable реализации не работают.   -  person CommonsWare    schedule 21.10.2016
comment
@CommonsWare, ты решил мою проблему. Не стесняйтесь публиковать это как ответ.   -  person Vipul Asri    schedule 23.10.2016


Ответы (1)


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

Следствием этого является то, что есть много мест, где пользовательские реализации Parcelable не работают, потому что какой-то другой процесс пытается работать с Parcelable и терпит неудачу с ClassNotFoundException (или эквивалентным).

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

Либо:

  • Пропустите этот специальный Parcelable или

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

  • Сначала преобразуйте его в какой-либо другой формат, например преобразование в byte[], прежде чем помещать его в дополнительный

person CommonsWare    schedule 23.10.2016