Java Android:将AppWidgetId传递给服务
我的主屏幕上有一个小部件,我在上面点击按钮。我将小部件id从小部件传递到服务,但是当我在服务读取WidgetId时,它总是3 小部件: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 =
@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()方法中,它终于起作用了。很好的发现。我已经尝试解决这个问题有一段时间了,一直以来都像基线示例一样。哎呀。非常感谢!