it-swarm.com.de

fangen Sie an, um das Ereignis zu schließen

Ich verwende eine Android-Benachrichtigung, um den Benutzer darauf hinzuweisen, sobald ein Dienst abgeschlossen ist (Erfolg oder Fehler), und ich möchte lokale Dateien löschen, wenn der Vorgang abgeschlossen ist.

Mein Problem ist, dass im Fehlerfall - ich möchte dem Benutzer eine "Wiederholungsoption" überlassen. und wenn er beschließt, die Benachrichtigung nicht erneut zu versuchen und zu verwerfen, möchte ich lokale Dateien löschen, die für den Prozess gespeichert wurden (Bilder ...).

Gibt es eine Möglichkeit, das Abwischereignis der Benachrichtigung abzufangen?

73
Dror Fichman

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 den Pending Intent auf einen Broadcast-Empfänger einstellen und dann jede gewünschte 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
         }

  }
129
Mr.Me

Eine vollständig ausgespülte Antwort (mit Dank an Herrn Me für die Antwort):

1) Erstellen Sie einen Empfänger, um das Ereignis "Wischen zum Schließen" abzuwickeln:

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 unter Verwendung einer eindeutigen ID für die ausstehende Absicht (die Benachrichtigungs-ID wird hier verwendet), da sonst dieselben Extras für jedes Kündigungsereignis 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) Bauen Sie Ihre Benachrichtigung auf:

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);
77
Chris Knight

Eine andere Idee:

wenn Sie normalerweise eine Benachrichtigung erstellen, benötigen Sie auch die Aktionen 1, 2 oder 3. Ich habe einen "NotifyManager" erstellt, der alle Benachrichtigungen erstellt, die ich brauche, und auch alle Intent-Anrufe entgegennimmt. So kann ich alle Aktionen UND auch das Ereignis "Entlassen" an EINEM Ort verwalten. 

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

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

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

um das deleteIntent zu erstellen, verwenden Sie dies (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 benutze 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 im selben NotificationManager befindet sich die perform-Funktion:

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
}
0
HowardS