setData on RemoteViewService intent

时间:2018-06-29 16:25:28

标签: android widget broadcastreceiver android-widget commonsware

有什么用?
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

在AppWidgetProvider类中的以下Intent上(请参见下面的代码)

根据CommonsWare的书,原因是:

  

虽然您的应用程序可以访问RemoteViewsService Class对象,但是应用程序小部件宿主将无法访问,因此我们需要可以跨流程边界使用的东西。您可以选择将自己的服务添加到RemoteViewsService并使用基于此的Intent,但这将使您的服务比您想要的更具公开性。

资料来源:Android开发繁忙的编码员指南 https://commonsware.com/Android/

但是当我删除此行时,没有任何变化。该小部件仍然有效。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int appWidgetId : appWidgetIds) {

        [...]

        Intent serviceIntent = new Intent(context, WidgetService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

        views.setRemoteAdapter(R.id.stack_view, serviceIntent);
        views.setEmptyView(R.id.stack_view, R.id.empty_view);

        [...]

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

1 个答案:

答案 0 :(得分:0)

我知道了。 如果您不使用setData,则系统将无法区分不同的服务意图,这将导致它仅对多个窗口小部件调用一次onGetViewFactory,并将相同的意图发送给所有窗口小部件。 例如,如果您将应用程序小部件ID发送到您的RemoteViewsService,并将其发送到RemoteViewsFactory并显示在每个项目中,那么如果您不这样做,它将为所有小部件实例显示相同的ID不要使用setData