Android:将AppWidgetId传递给服务

时间:2010-09-02 08:36:09

标签: java android widget android-widget

我的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);
}

那么我做错了什么?

3 个答案:

答案 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