在RemoteViewsService
onReceive()
AppWidgetProvider
方法中从string
获取parcelable对象时,我总是得到 null 。
我试过了,传递了int
和parcelable
,但它运行得很好但不是@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}}
答案 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[]
,然后再将其添加到其他格式