Ответ 1
Наконец, я обнаружил, что проблема возникает, потому что я отправляю тот же "requestCode"
PendingIntent.getService(context, appWidgetId
Это должно быть как
PendingIntent.getService(context, 0
PendingIntent.getService(context, 1
Привет. Я пытаюсь отправить дополнительные данные через 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"
Что я делаю неправильно?
Наконец, я обнаружил, что проблема возникает, потому что я отправляю тот же "requestCode"
PendingIntent.getService(context, appWidgetId
Это должно быть как
PendingIntent.getService(context, 0
PendingIntent.getService(context, 1
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Измените флаг на PendingIntent.FLAG_ONE_SHOT
.
Правильный ответ, я думаю, будет использовать флаг
FLAG_UPDATE_CURRENT
Это приведет к повторному использованию существующих ожидающих намерений, но заменит их дополнительные данные.
Я обнаружил, что если намерение, которое использовалось для создания ожидающего намерения, имеет какие-либо дополнительные функции, которые уже присутствуют в нем, то новые намерения необязательно игнорируются. Например, если вы следуете образцу в документах 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]);
Не будет препятствовать вашим новым намерениям. Я удалил эту строку, и мои вещи работали