Java Android:将AppWidgetId传递给服务

Java Android:将AppWidgetId传递给服务,java,android,widget,android-widget,Java,Android,Widget,Android Widget,我的主屏幕上有一个小部件,我在上面点击按钮。我将小部件id从小部件传递到服务,但是当我在服务读取WidgetId时,它总是3 小部件: @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int appWidgetId : appWidgetIds) { RemoteViews remoteView =

我的主屏幕上有一个小部件,我在上面点击按钮。我将小部件id从小部件传递到服务,但是当我在服务读取WidgetId时,它总是3

小部件:

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

    for (int appWidgetId : appWidgetIds) {
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget);

        Intent intent = new Intent(context, WidgetService.class);


        // prints the correct appWidgetId
        System.out.println(appWidgetId);


        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        remoteView.setOnClickPendingIntent(R.id.Button01, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, remoteView);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}
该服务如下所示:

public int onStartCommand(Intent intent, int flags, int startId){
    if (intent != null && intent.getExtras() != null) {

        int widgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);

        // 3 is always printend
        System.out.println(widgetId);

        // More stuff here

    }
    return super.onStartCommand(intent, flags, startId);
}

那么我做错了什么呢?

如果不耍花招,你想做的事是行不通的

每个
Intent
只能有一个未完成的
pendingent
。因此,如果您创建了两个等价的
意图
(在非额外数据上匹配),并尝试创建两个
PendingEvents
,那么最终将得到一个
PendingEvent
。使用哪个
Intent
取决于您提供给
getService()
(或
getActivity()
getBroadcast()
)的标志。在您的情况下,将始终使用第一个
Intent

如果您只有一个未完成的
pendingent
,但只想更新它的附加内容,
FLAG\u update\u CURRENT
将起作用。但是,您需要N个未完成的
PendingIntents


我所知道的在您的案例中实现该功能的唯一方法是在
意图中放置一个唯一的操作字符串。由于您正在指定组件(
WidgetService.class
),因此操作字符串将不用于路由。但是,只需提供多个
pendingent
对象就足够了。

要添加到上面的注释中,请参见此示例,了解如何使您的意图独特:
这似乎是一个非常愚蠢的设计和更糟糕的解决办法,但我想这就是它的方式。我花了很长时间才找到上面这个简单的例子。请特别注意intent.setData(Uri)调用。我将这些行剪切并粘贴到我的onUpdate()方法中,它终于起作用了。

很好的发现。我已经尝试解决这个问题有一段时间了,一直以来都像基线示例一样。哎呀。非常感谢!