代码之家  ›  专栏  ›  技术社区  ›  Florian Walther

在RemoteViewService意图上设置数据

  •  1
  • Florian Walther  · 技术社区  · 6 年前

    有什么用

    serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
    

    在以下方面 Intent 在AppWidgetProvider类中(请参阅下面的代码)

    根据公共软件手册,原因是:

    虽然您的应用程序可以访问RemoteViewsService类对象,但应用程序小部件宿主不能访问,因此我们需要跨进程边界工作的东西。您可以选择将自己的服务添加到RemoteViewsService并使用基于此的意图,但这将使您的服务比您可能希望的更公开。

    来源: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 回复  |  直到 6 年前
        1
  •  0
  •   Florian Walther    6 年前

    我想出来了。 如果你不使用 setData ,系统无法区分不同的服务意图,导致调用 onGetViewFactory 只对多个小部件发送一次,并将相同的意图发送给所有小部件。 例如,如果您将app widget id发送到 RemoteViewsService 从他们到你 RemoteViewsFactory 如果不使用 设置数据 是的。