Fang auf Wischen, um das Ereignis zu schließen

85

Ich verwende eine Android-Benachrichtigung, um den Benutzer zu benachrichtigen, sobald ein Dienst beendet ist (Erfolg oder Misserfolg), und ich möchte lokale Dateien löschen, sobald der Vorgang abgeschlossen ist.

Mein Problem ist, dass ich im Falle eines Fehlers dem Benutzer eine "Wiederholungs" -Option erlauben möchte. und wenn er sich dafür entscheidet, die Benachrichtigung nicht erneut zu versuchen und zu verwerfen, möchte ich lokale Dateien löschen, die für die Prozesszwecke gespeichert wurden (Bilder ...).

Gibt es eine Möglichkeit, das Swipe-to-Dismiss-Ereignis der Benachrichtigung abzufangen?

Dror Fichman
quelle

Antworten:

144

DeleteIntent : DeleteIntent ist ein PendingIntent-Objekt, das einer Benachrichtigung zugeordnet werden kann und ausgelöst wird, wenn die Benachrichtigung gelöscht wird.

  • Benutzerspezifische Aktion
  • Benutzer Löschen Sie alle Benachrichtigungen.

Sie können die ausstehende Absicht auf einen Rundfunkempfänger festlegen und dann eine beliebige Aktion ausführen.

  Intent intent = new Intent(this, MyBroadcastReceiver.class);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);
  Builder builder = new Notification.Builder(this):
 ..... code for your notification
  builder.setDeleteIntent(pendingIntent);

MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             .... code to handle cancel
         }

  }
Mr.Me
quelle
8
Das ist spät. Ich habe mich nur gefragt, ob es einen ähnlichen Ansatz für Benachrichtigungen gibt, der, builder.setAutoCancel(true);wenn ein Benutzer auf die Benachrichtigung klickt und diese abgebrochen wird, die Löschabsicht nicht ausgelöst wird
devanshu_kaushik
1
@dev_android checkout developer.android.com/reference/android/app/…
Mr.Me
Ja, es funktioniert gut, aber nicht in Oreo und höher API. Bitte helfen Sie mir für Oreo
Peter
@Peter Damit es in Oreo und Obove funktioniert, müssen Sie folgende Codezeile hinzufügen: Notification note = builder.build (); note.flags | = Notification.FLAG_AUTO_CANCEL;
Dimas Mendes
86

Eine vollständig ausgefüllte Antwort (danke an Herrn Me für die Antwort):

1) Erstellen Sie einen Empfänger, um das Ereignis "Wischen zum Entlassen" zu behandeln:

public class NotificationDismissedReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
      int notificationId = intent.getExtras().getInt("com.my.app.notificationId");
      /* Your code to handle the event here */
  }
}

2) Fügen Sie Ihrem Manifest einen Eintrag hinzu:

<receiver
    android:name="com.my.app.receiver.NotificationDismissedReceiver"
    android:exported="false" >
</receiver>

3) Erstellen Sie die ausstehende Absicht mit einer eindeutigen ID für die ausstehende Absicht (hier wird die Benachrichtigungs-ID verwendet), da ohne diese die gleichen Extras für jedes Entlassungsereignis wiederverwendet werden:

private PendingIntent createOnDismissedIntent(Context context, int notificationId) {
    Intent intent = new Intent(context, NotificationDismissedReceiver.class);
    intent.putExtra("com.my.app.notificationId", notificationId);

    PendingIntent pendingIntent =
           PendingIntent.getBroadcast(context.getApplicationContext(), 
                                      notificationId, intent, 0);
    return pendingIntent;
}

4) Erstellen Sie Ihre Benachrichtigung:

Notification notification = new NotificationCompat.Builder(context)
              .setContentTitle("My App")
              .setContentText("hello world")
              .setWhen(notificationTime)
              .setDeleteIntent(createOnDismissedIntent(context, notificationId))
              .build();

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, notification);
Chris Knight
quelle
Hat bei mir nicht funktioniert, führte immer zu dem Fehler "Empfänger kann nicht instanziiert werden .... hat keinen Null-Argument-Konstruktor". Gelöst erst, nachdem ich eine andere ähnliche Lösung implementiert habe, aber mit der Registrierung des Rundfunkempfängers: stackoverflow.com/questions/13028122/…
Alexeev Valeriy
Dies funktioniert für mich. Das Ereignis kann jedoch nicht aufgerufen werden, wenn Sie auf die Benachrichtigung klicken. Wie kann ich das Klickereignis abhören?
Allen Vork
Laut den Dokumenten wird, wenn Sie verwenden setAutoCancel(true), die Benachrichtigung abgebrochen , wenn Sie darauf
klicken,
Dies funktioniert mit Ausnahme der Parameterübergabe. Intent.getExtras () gibt immer null zurück, auch wenn Extras festgelegt sind. Damit es funktioniert, müssen Sie die folgende Aktion festlegen: resultIntent.setAction (unique_action);
lxknvlk
0

Eine andere Idee:

Wenn Sie normalerweise eine Benachrichtigung erstellen, benötigen Sie auch die Aktionen eins, zwei oder drei. Ich habe einen "NotifyManager" erstellt, der alle benötigten Benachrichtigungen erstellt und auch alle beabsichtigten Anrufe empfängt. So kann ich alle Aktionen verwalten UND auch das Entlassungsereignis an EINEM Ort abfangen.

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

public NotifyPerformService() {
    super("NotifyService");
    ...//some Dagger stuff
}

@Override
public void onHandleIntent(Intent intent) {
    notificationManager.performNotifyCall(intent);
}

Verwenden Sie Folgendes, um den deleteIntent zu erstellen (im NotificationManager):

private PendingIntent createOnDismissedIntent(Context context) {
    Intent          intent          = new Intent(context, NotifyPerformMailService.class).setAction("ACTION_NOTIFY_DELETED");
    PendingIntent   pendingIntent   = PendingIntent.getService(context, SOME_NOTIFY_DELETED_ID, intent, 0);

    return pendingIntent;
}

und DAS verwende ich, um die Löschabsicht wie folgt festzulegen (im NotificationManager):

private NotificationCompat.Builder setNotificationStandardValues(Context context, long when){
    String                          subText = "some string";
    NotificationCompat.Builder      builder = new NotificationCompat.Builder(context.getApplicationContext());


    builder
            .setLights(ContextUtils.getResourceColor(R.color.primary) , 1800, 3500) //Set the argb value that you would like the LED on the device to blink, as well as the rate
            .setAutoCancel(true)                                                    //Setting this flag will make it so the notification is automatically canceled when the user clicks it in the panel.
            .setWhen(when)                                                          //Set the time that the event occurred. Notifications in the panel are sorted by this time.
            .setVibrate(new long[]{1000, 1000})                                     //Set the vibration pattern to use.

            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
            .setSmallIcon(R.drawable.ic_white_24dp)
            .setGroup(NOTIFY_GROUP)
            .setContentInfo(subText)
            .setDeleteIntent(createOnDismissedIntent(context))
    ;

    return builder;
}

und schließlich befindet sich im selben NotificationManager die Funktion perform:

public void performNotifyCall(Intent intent) {
    String  action  = intent.getAction();
    boolean success = false;

    if(action.equals(ACTION_DELETE)) {
        success = delete(...);
    }

    if(action.equals(ACTION_SHOW)) {
        success = showDetails(...);
    }

    if(action.equals("ACTION_NOTIFY_DELETED")) {
        success = true;
    }


    if(success == false){
        return;
    }

    //some cleaning stuff
}
HowardS
quelle