2013-02-03 22 views
66

Używam powiadomienia Android, aby ostrzec użytkownika po zakończeniu usługi (sukces lub niepowodzenie), a po zakończeniu procesu chcę usunąć lokalne pliki.catch on swipe, aby odrzucić zdarzenie

Mój problem polega na tym, że w przypadku awarii - chcę umożliwić użytkownikowi opcję "ponów". a jeśli zdecyduje się nie próbować i odrzucić powiadomienie, chcę usunąć pliki lokalne zapisane dla celów procesu (obrazy ...).

Czy istnieje sposób na złapanie zdarzenia zamiany powiadomienia na odrzucenie?

Odpowiedz

104

DeleteIntent: DeleteIntent jest obiektem PendingIntent, które mogą być związane ze zgłoszeniem i zostaje zwolniony, gdy zgłoszenie zostanie usunięte, eter przez: konkretne działania

  • użytkownika
  • Użytkownik Usuń wszystkie powiadomienia .

Możesz ustawić oczekujący cel na odbiornik transmisji, a następnie wykonaj dowolną akcję.

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 
     } 

    } 
+0

Działa :) Dziękuję bardzo! –

+5

Jest późno. Zastanawiam się tylko, czy istnieje podobne podejście do powiadomień, które miały 'builder.setAutoCancel (true);' , ponieważ użytkownik kliknie powiadomienie i zostanie anulowane, delete-Intent nie zostanie wywołany –

+1

@dev_android checkout http://developer.android.com/reference/android/app/Notification.Builder.html#setContentIntent(android.app.PendingIntent) –

66

W pełni wypłukane odpowiedź (z podziękowaniem do pana mnie na odpowiedź):

1) Utwórz odbiornik do obsługi bezstykowa-to- odwołanie zdarzenia:

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) Dodaj wpis r oczywisty:

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

3) Tworzenie oczekującą intencję za pomocą unikalnego identyfikatora dla toczącej intencyjny (id powiadomienie jest tutaj), jak bez tego te same dodatki zostaną ponownie wykorzystane dla każdego zdarzenia zwolnienia:

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) Zbuduj swoje zgłoszenie:

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); 
+0

Ładnie zrobione koleś! –

+0

Nie zadziałał dla mnie, zawsze skutkowało błędem "Nie można zainicjować odbiornika .... nie ma konstruktora argumentów zerowych". Rozwiązano dopiero po wdrożeniu innego podobnego rozwiązania, ale po zarejestrowaniu odbiornika telewizyjnego: http://stackoverflow.com/questions/13028122/how-to-use-delete-intent-to-perform-some-action-on -clear-notification –

+0

To działa dla mnie.Ale zdarzenia nie można wywołać po kliknięciu powiadomienia.Jak mogę usłyszeć wydarzenie click? –

0

inny pomysł:

ja Jeśli utworzysz powiadomienie, normalnie potrzebujesz również akcji jednego, dwóch lub trzech. Stworzyłem "NotifyManager", który tworzy wszystkie powiadomienia, których potrzebuję, a także wszystkie połączenia Intent. Dzięki temu mogę zarządzać wszystkimi działaniami, a także złapać wydarzenie zwolnienia w JEDNYM miejscu.

public class NotifyPerformService extends IntentService { 

@Inject NotificationManager notificationManager; 

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

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

aby stworzyć deleteIntent to wykorzystać (w 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; 
} 

i że mogę używać, aby ustawić usuwania Intent tak (w 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; 
} 

i na końcu w tym samym Menedżerze powiadomień jest funkcja wykonująca:

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 
}