Подтвердить что ты не робот

Как определить, было ли отклонено уведомление?

Есть ли какой-либо способ в Android обнаружить, когда пользователь просматривает уведомление слева и удаляет его? Я использую alarmmanager для установки повторного оповещения, и мне нужно, чтобы мое повторное предупреждение прекращалось, когда уведомление было отменено пользователем. Здесь мой код:

Установка повторяющегося оповещения:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), repeatFrequency, displayIntent);

Мой код уведомления:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Get the notification ID.
    int notifID = getIntent().getExtras().getInt("Reminder_Primary_Key");

    //Get the name of the reminder.
    String reminderName = getIntent().getExtras().getString("Reminder_Name");

    //PendingIntent stores the Activity that should be launched when the user taps the notification.
    Intent i = new Intent(this, ViewLocalRemindersDetail.class);
    i.putExtra("NotifID", notifID);
    i.putExtra("notification_tap", true);

    //Add FLAG_ACTIVITY_NEW_TASK to stop the intent from being launched when the notification is triggered.
    PendingIntent displayIntent = PendingIntent.getActivity(this, notifID, i, Intent.FLAG_ACTIVITY_NEW_TASK);

    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notif = new Notification(R.drawable.flag_red_large, reminderName, System.currentTimeMillis());

    CharSequence from = "Here your reminder:";

    CharSequence message = reminderName;        
    notif.setLatestEventInfo(this, from, message, displayIntent);

    //Pause for 100ms, vibrate for 250ms, pause for 100ms, and vibrate for 500ms.
    notif.defaults |= Notification.DEFAULT_SOUND;
    notif.vibrate = new long[] { 100, 250, 100, 500 };
    nm.notify(notifID, notif);

    //Destroy the activity/notification.
    finish();

}

Я знаю, что мне нужно позвонить alarmManager.cancel(displayIntent), чтобы отменить мой повторяющийся сигнал. Однако я не понимаю, куда поместить этот код. Мне нужно отменить повторное оповещение ТОЛЬКО, когда пользователь нажал на уведомление или отклонил его. Спасибо за вашу помощь!

4b9b3361

Ответ 1

Я считаю, что Notification.deleteIntent - это то, что вы ищете. Док говорит:

Цель выполнить, когда уведомление явно отклонено пользователем, либо с помощью кнопки "Очистить все", либо путем индивидуальной отладки. Это, вероятно, не должно запускать действие, так как некоторые из них будут отправлены одновременно.

Ответ 2

Для всех этих будущих людей - вы можете зарегистрировать широковещательный приемник для прослушивания уведомлений об удалении.

Создать новый широковещательный приемник:

public class NotificationBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (action == null || !action.equals(Config.NotificationDeleteAction)) {
            return;
        }

        // Do some sweet stuff
        int x = 1;
    }
}

Зарегистрировать широковещательный приемник в вашем классе приложения:

"Если ваше приложение нацелено на уровень API 26 или выше, вы не можете использовать манифест для объявления получателя для большинства неявных трансляций (трансляции, которые специально не предназначены для вашего приложения).

Документация для Android.

  registerReceiver(
        new NotificationBroadcastReceiver(),
        new IntentFilter(Config.NotificationDeleteAction)
  );

Вероятно, вы заметили статическую переменную Config.NotificationDeleteAction. Это уникальный идентификатор строки для вашего уведомления. Обычно это следует за следующим {namespace} {actionName} соглашением:

you.application.namespace.NOTIFICATION_DELETE

Задайте цель удаления для создателя уведомлений:

notificationBuilder
       ...
        .setDeleteIntent(createDeleteIntent())
       ...

Где, createDeleteIntent - это следующий метод:

private PendingIntent createDeleteIntent() {
    Intent intent = new Intent();
    intent.setAction(Config.NotificationDeleteAction);

    return PendingIntent.getBroadcast(
            context,
            0,
            intent,
            PendingIntent.FLAG_ONE_SHOT
    );
}

Зарегистрированный вещательный приемник должен получить намерение, когда ваше уведомление будет отклонено.

Ответ 3

Вы также можете использовать Activity PendingIntent, который может быть проще реализовать, если у вас есть Activity, который может обрабатывать увольнение, потому что вам не нужно создавать и настраивать широковещательный приемник.

public static final String DELETE_TAG = "DELETE_TAG";

private PendingIntent createDeleteIntent(Context context) {
    Intent intent = new Intent(context, MyActivity.class);
    intent.putExtra(DELETE_TAG, true);

    return PendingIntent.getActivity(
            context,
            0,
            intent,
            PendingIntent.FLAG_ONE_SHOT
    );
}

MyActivity получит намерение в своем onCreate(), и в этом примере можно было бы просмотреть DELETE_TAG, чтобы узнать его.