Определите addAction для уведомлений Android

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

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

Я использую BroadcastReceiver чтобы поймать клики, но я не знаю, как определить, какая кнопка была нажата.

Это код AddActionAddAction остальную часть уведомления, так как это хорошо работает) –

  //Yes intent Intent yesReceive = new Intent(); yesReceive.setAction(CUSTOM_INTENT); Bundle yesBundle = new Bundle(); yesBundle.putInt("userAnswer", 1);//This is the value I want to pass yesReceive.putExtras(yesBundle); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes); //Maybe intent Intent maybeReceive = new Intent(); maybeReceive.setAction(CUSTOM_INTENT); Bundle maybeBundle = new Bundle(); maybeBundle.putInt("userAnswer", 3);//This is the value I want to pass maybeReceive.putExtras(maybeBundle); PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe); //No intent Intent noReceive = new Intent(); noReceive.setAction(CUSTOM_INTENT); Bundle noBundle = new Bundle(); noBundle.putInt("userAnswer", 2);//This is the value I want to pass noReceive.putExtras(noBundle); PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo); 

Это код BroadcastReceiver

  public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v("shuffTest","I Arrived!!!!"); //Toast.makeText(context, "Alarm worked!!", Toast.LENGTH_LONG).show(); Bundle answerBundle = intent.getExtras(); int userAnswer = answerBundle.getInt("userAnswer"); if(userAnswer == 1) { Log.v("shuffTest","Pressed YES"); } else if(userAnswer == 2) { Log.v("shuffTest","Pressed NO"); } else if(userAnswer == 3) { Log.v("shuffTest","Pressed MAYBE"); } } } 

Я зарегистрировал BroadcastReceiver в манифесте. Кроме того, я хочу упомянуть, что BroadcastReceiver вызывается, когда я нажимаю одну из кнопок в уведомлении, но намерение всегда включает в себя дополнительно «2».

Это обозначение iseslf – уведомление

Это потому, что вы используете FLAG_UPDATE_CURRENT с намерениями, которые имеют одно и то же действие

Из документов:

если описанный PendingIntent уже существует, сохраните его, а замените его дополнительные данные тем, что находится в этом новом намерении.

Когда вы указываете pendingIntentMaybe и pendingIntentNo , система использует PendingIntent созданный для pendingIntentYes , но перезаписывает дополнительные функции. Таким образом, все три переменные относятся к одному и тому же объекту, а последние дополнительные параметры указываются для pendingIntentNo .

Вы должны указать альтернативное действие для каждого Intent . У вас все еще есть один BroadcastReceiver , и просто перехватите все три действия. Это было бы менее запутанным семантически также 🙂

Плакат с уведомлением:

 //Yes intent Intent yesReceive = new Intent(); yesReceive.setAction(YES_ACTION); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes); //Maybe intent Intent maybeReceive = new Intent(); maybeReceive.setAction(MAYBE_ACTION); PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe); //No intent Intent noReceive = new Intent(); noReceive.setAction(NO_ACTION); PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo); 

Ваш приемник:

 @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(YES_ACTION.equals(action)) { Log.v("shuffTest","Pressed YES"); } else if(MAYBE_ACTION.equals(action)) { Log.v("shuffTest","Pressed NO"); } else if(NO_ACTION.equals(action)) { Log.v("shuffTest","Pressed MAYBE"); } } 

ШАГ ЗА ШАГОМ

Шаг 1

 public void noto2() // paste in activity { Notification.Builder notif; NotificationManager nm; notif = new Notification.Builder(getApplicationContext()); notif.setSmallIcon(R.drawable.back_dialog); notif.setContentTitle(""); Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); notif.setSound(path); nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Intent yesReceive = new Intent(); yesReceive.setAction(AppConstant.YES_ACTION); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); notif.addAction(R.drawable.back_dialog, "Yes", pendingIntentYes); Intent yesReceive2 = new Intent(); yesReceive2.setAction(AppConstant.STOP_ACTION); PendingIntent pendingIntentYes2 = PendingIntent.getBroadcast(this, 12345, yesReceive2, PendingIntent.FLAG_UPDATE_CURRENT); notif.addAction(R.drawable.back_dialog, "No", pendingIntentYes2); nm.notify(10, notif.getNotification()); } 

Шаг 1.5.

Я создал глобальный class AppConstant

  public class AppConstant { public static final String YES_ACTION = "YES_ACTION"; public static final String STOP_ACTION = "STOP_ACTION"; } 

Шаг 2:

  public class NotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (AppConstant.YES_ACTION.equals(action)) { Toast.makeText(context, "YES CALLED", Toast.LENGTH_SHORT).show(); } else if (AppConstant.STOP_ACTION.equals(action)) { Toast.makeText(context, "STOP CALLED", Toast.LENGTH_SHORT).show(); } } 

}

Шаг 3

        

в моем случае это сработало для меня после добавления фильтра намерений

         

здесь YES_ACTION должен быть yourfullpackagename.YES

как

 private static final String YES_ACTION = "com.example.packagename.YES"; 

вы также можете использовать NO_ACTION или MAYBE_ACTION

В BroadcastReceiver вы должны использовать тот же YES_ACTION как указано выше,

означает, что в classе BroadcastReceiver вы можете проверить пользовательскую трансляцию, следуя

 public class NotificationReceiver extends BroadcastReceiver { private static final String YES_ACTION = "com.example.packagename.YES"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(YES_ACTION.equals(action)) { Toast.makeText(context, "CALLED", Toast.LENGTH_SHORT).show(); } } 

}

Примечание: вместо YES в строке YES_ACTION вы также можете использовать другое слово.

  • Push-уведомления, когда приложение закрыто
  • Как выполнить метод, нажав на уведомление
  • NotificationCompat с API 26
  • Извлечение текста извещных, contentView или contentIntent
  • Как реализовать устаревшие методы уведомления
  • Лучший способ сериализации NSData в hexadeximal string
  • я хочу показать уведомление в 8:00 ежедневно
  • Уведомление о восстановлении задачи, а не конкретной деятельности?
  • android: запуск фоновой задачи с помощью AlarmManager
  • PendingIntent работает правильно для первого уведомления, но неправильно для остальных
  • Проверьте, включены ли локальные уведомления в IOS 8
  • Interesting Posts

    Ошибка компиляции Android Hello-World: Intellij не может найти aapt

    Почему значения кеширования classа Integer в диапазоне от -128 до 127?

    Какие свойства теряются, когда окна говорят, что у x.jpg есть свойства, которые нельзя скопировать в новое местоположение

    Автоматическое увеличение в MongoDB для сохранения последовательности уникального идентификатора пользователя

    Объяснить вывод ipconfig / displaydns

    ASP.NET MVC 4 Application Calling Remote WebAPI

    Не удалось выполнить dex: несколько файлов dex определяют

    «Время с / Аго» для Android / Java

    Как включить ведение журнала сбоев сборки (Fusion) в .NET.

    Не обнаружено никаких результатов при автозаполнении jQuery UI

    Recyclerview мучительно медленно загружает кешированные изображения из Picasso

    Могу ли я получить свой http в адресной строке в Firefox?

    Как подключить интернет-радио в тюнер?

    Единичное тестирование с одноточечными

    Как обновить заявку в Identity ASP.NET?

    Давайте будем гением компьютера.