Android主屏幕小部件:RemoteViews setRemoteAdapter(...)方法不适用于API 11+

JMR*_*ies 9 android android-widget

所以onUpdate方法调用

remoteViews.setRemoteAdapter(id, R.id.listview, intent)

为了将适配器应用于窗口小部件中的列表视图.

窗口小部件的标题中有一个按钮,可以更改列表视图显示的数据集(对于假设的电子邮件窗口小部件,请考虑收件箱,发件箱,已加星标等).当我单击该按钮时,它会将用户带到一个Activity,允许他们选择要显示的数据集.选择后,将运行以下代码:

Intent intent = new Intent(this, WidgetReceiver.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
intent.putExtra("notify", true);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {R.xml.widget_provider});
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

这成功调用了widget的AppWidgetProvider类中的onUpdate方法.但是,如果我要在不同类型的数据集之间切换,则在2-3个首选项更改之后,该setRemoteAdapter方法将停止运行.我已经广泛记录了这个过程,并且该方法应该调用一个服务,该服务反过来加载RemoteViewsService.RemoteViewsFactory类来填充小部件及其适配器,但不执行任何这些操作.您最初几次更改首选项,它按预期工作.但之后就退出了.

有没有人知道这里发生了什么?

JMR*_*ies 13

很奇怪,但找到了解决方案.Android似乎正在缓存您在onUpdate方法中使用的意图.如果您重新发送看似相同的意图,它将无法按预期执行.

解决方案:有一个静态迭代整数,你在intent extras中包含一个param.它解决了我的问题.

Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
Run Code Online (Sandbox Code Playgroud)

哦,Android ......