Отправить данные EXTRA через PendingIntent

Привет. Я пытаюсь отправить дополнительные данные через PendingIntent.

Это мой код

//**1**
    Intent intent = new Intent(context, UpdateService.class); 
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
    appWidgetId); 
            intent.putExtra(BaseConfigurationActivity.EXTRA_WIDGET_MODE, 
    2); 
            // put appWidgetId here or intent will replace an intent of 
    another widget 
            PendingIntent pendingIntent = 
    PendingIntent.getService(context, appWidgetId, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
            views.setOnClickPendingIntent(R.id.gridview_button, 
    pendingIntent); 

//**2**
            intent = new Intent(context, UpdateService.class); 
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
    appWidgetId); 
            intent.putExtra(BaseConfigurationActivity.EXTRA_WIDGET_MODE, 
    1); 
            // put appWidgetId here or intent will replace an intent of 
    another widget 
            pendingIntent = PendingIntent.getService(context, appWidgetId, 
    intent, PendingIntent.FLAG_UPDATE_CURRENT); 
            views.setOnClickPendingIntent(R.id.listview_button, 
    pendingIntent); 

В моем коде он назначает pendingIntent двум кнопкам gridview_button с EXTRA_WIDGET_MODE 2 и listview_button с EXTRA_WIDGET_MODE 1

когда я нажимаю на gridview_button, и вызывает класс UpdateService Я также получил значение EXTRA_WIDGET_MODE: "1"

Что я делаю неправильно?

Ответ 1

Наконец, я обнаружил, что проблема возникает, потому что я отправляю тот же "requestCode"

PendingIntent.getService(context, appWidgetId 

Это должно быть как

PendingIntent.getService(context, 0 
PendingIntent.getService(context, 1 

Ответ 2

PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);

Измените флаг на PendingIntent.FLAG_ONE_SHOT.

Ответ 3

Правильный ответ, я думаю, будет использовать флаг

FLAG_UPDATE_CURRENT

Это приведет к повторному использованию существующих ожидающих намерений, но заменит их дополнительные данные.

Ответ 4

Я обнаружил, что если намерение, которое использовалось для создания ожидающего намерения, имеет какие-либо дополнительные функции, которые уже присутствуют в нем, то новые намерения необязательно игнорируются. Например, если вы следуете образцу в документах Android для создания такого виджета

Intent toastIntent = new Intent(context, StackWidgetProvider.class);
toastIntent.setAction(StackWidgetProvider.TOAST_ACTION);
toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);

Тогда линия

toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);

Не будет препятствовать вашим новым намерениям. Я удалил эту строку, и мои вещи работали