Как использовать delete намерение выполнить некоторые действия по четкому уведомлению?

Я хочу reset переменную моей службы, когда пользователь очищает мое уведомление: все!

Оглядываясь, я вижу, что все предлагают добавить намерение удалить мое уведомление, но намерение используется для запуска активности, службы o независимо от того, когда мне просто нужна такая вещь:

void onClearPressed(){
   aVariable = 0;
}

как получить этот результат?

Ответ 1

Уведомления не управляются вашим приложением, и все вещи, такие как показ уведомлений и их очистка, фактически происходят в другом процессе. Вы не можете заставить другое приложение непосредственно выполнять часть кода только из соображений безопасности.

Единственная возможность в вашем случае - предоставить PendingIntent, который просто обертывается вокруг обычного намерения и будет запущен от имени вашего приложения, когда уведомление будет очищено. Вам нужно использовать PendingIntent для отправки трансляции или запуска службы, а затем делать то, что вы хотите в широковещательном приемнике или в сервисе. Что именно использовать, зависит от того, из какого компонента приложения вы показываете уведомления.

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

public class NotificationHelper {
    private static final String NOTIFICATION_DELETED_ACTION = "NOTIFICATION_DELETED";

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            aVariable = 0; // Do what you want here
            unregisterReceiver(this);
        }
    };

    public void showNotification(Context ctx, String text) {
        Intent intent = new Intent(NOTIFICATION_DELETED_ACTION);
        PendingIntent pendintIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0);
        registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION));
        Notification n = new Notification.Builder(mContext).
          setContentText(text).
          setDeleteIntent(pendintIntent).
          build();
        NotificationManager.notify(0, n);
    }
}

Ответ 2

Андрей прав.
Если вы хотите вернуть несколько сообщений, таких как:

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

Вы должны зарегистрировать каждый из этих фильтров ответов:

public void showNotification(Context ctx, String text) ()
{
    /… create intents and pending intents same format as Andrie did../
    /… you could also set up the style of your message box etc. …/

    //need to register each response filter
    registerReceiver(receiver, new IntentFilter(CLICK_ACTION));
    registerReceiver(receiver, new IntentFilter(USER_RESPONSE_ACTION));
    registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION));

    Notification n = new Notification.Builder(mContext)
      .setContentText(text)
      .setContentIntent(pendingIntent)                          //Click action
      .setDeleteIntent(pendingCancelIntent)                     //Cancel/Deleted action
      .addAction(R.drawable.icon, "Title", pendingActionIntent) //Response action
      .build();

    NotificationManager.notify(0, n);

}

Затем вы можете поймать различные ответы с помощью операторов if, else (как это сделал Андрей) или с помощью оператора switch.

Примечание: я делаю этот ответ в первую очередь потому, что нигде не смог его найти, и мне пришлось самому в этом разобраться. (возможно, я буду помнить это лучше для этого :-) Удачи!