appwidget提供程序中的parcelable对象始终返回null

时间:2016-10-21 19:46:01

标签: android android-appwidget appwidgetprovider

RemoteViewsService onReceive() AppWidgetProvider方法中从string获取parcelable对象时,我总是得到 null

我试过了,传递了intparcelable,但它运行得很好但不是@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); }

StackWidgetProvider.java 扩展AppWidgetProvider

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

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

StackWidgetService.java 扩展了RemoteServiceView

{{1}}

1 个答案:

答案 0 :(得分:4)

自定义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[],然后再将其添加到其他格式