我的HomeScreen上有一个Widget,我在其上添加了一个按钮。我将小部件ID从Widget传递给服务,但是当我在服务中读取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);
}
那么我做错了什么?
答案 0 :(得分:4)
你想要做的事情是行不通的,AFAIK,没有一些诡计。
每PendingIntent
只能有一个未完成的Intent
。因此,如果您创建两个等效的Intents
(与非额外数据匹配),并且您尝试创建两个PendingIntents
,那么您到底最终会得到一个PendingIntent
。使用哪个Intent
取决于您提供给getService()
(或getActivity()
或getBroadcast()
)的标记。在您的情况下,将始终使用第一个Intent
。
如果您只有一个未完成的PendingIntent
,但只是想更新其附加内容,FLAG_UPDATE_CURRENT
会起作用。但是,你想要N个杰出的PendingIntents
。
我所知道的唯一方法就是在Intent
中添加一个唯一的操作字符串。由于您指定了组件(WidgetService.class
),因此操作字符串不会用于路由。但是,为您提供多个PendingIntent
对象就足够了。
答案 1 :(得分:3)
只需添加上面的评论,请参阅此示例,了解如何使您的意图具有唯一性: http://developer.android.com/resources/samples/StackWidget/src/com/example/android/stackwidget/StackWidgetProvider.html 这似乎是一个非常愚蠢的设计和更糟糕的解决方法,但我想这是它的方式。我花了很长时间才找到上面的简单例子。特别注意intent.setData(Uri)调用。我将这些行剪切并粘贴到我的onUpdate()方法中,最终工作。
答案 2 :(得分:0)
有一种简单的方法可以解决它。 变化
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
要
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
请参阅http://developer.android.com/reference/android/app/PendingIntent.html