2013-02-03 23 views
66

Bir hizmet bittiğinde (başarı veya başarısızlık) kullanıcıyı uyarmak için bir android bildirimi kullanıyorum ve işlem tamamlandıktan sonra yerel dosyaları silmek istiyorum.Olayı kapatmak için hızlıca kaydırın

Sorunum, hata durumunda - kullanıcıya "yeniden deneme" seçeneği vermek istiyorum. ve eğer yeniden denememeyi seçerse ve bildirimi reddederse, işlem amaçları için kaydedilmiş yerel dosyaları silmek istiyorum (görüntüler ...).

Bildirimin tokatlamak-kapanma olayını yakalamanın bir yolu var mı?

cevap

104

DeleteIntent: DeleteIntent bir bildirim ile ilişkilendirilebilir ve bildirim silindiğinde eter ile, ateş alan bir PendingIntent nesnesidir:

  • Kullanıcı belirli bir eylem
  • Kullanıcı tüm bildirimleri silme .

Bekleyen Amacı bir yayın Alıcısına ayarlayabilirsiniz ve daha sonra istediğiniz herhangi bir eylemi gerçekleştirebilirsiniz.

1) tokatlamak-to- işlemek için bir alıcı oluşturun:

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

Works :) çok teşekkür ederim! –

+5

Bu gecikti. Ben sadece bir kullanıcı bildirim tıklattığında ve iptal edildi, 'builder.setAutoCancel (true); olan bildirim için benzer bir yaklaşım olup olmadığını merak ettim, silme-Niyet –

+1

@dev_android ödeme http:/tetiklenmiş değil /developer.android.com/reference/android/app/Notification.Builder.html#setContentIntent(android.app.PendingIntent) –

66

Tam (cevap Sn Me sayesinde birlikte) cevabı dışarı kızardı dismiss olayı:

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) Size bir giriş ekleyin

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; 
} 
: r tezahür: Aynı ekstralar her işten çıkarma olayı için yeniden bu olmadan

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

3) (bildirim kimliği burada kullanılan) bekleyen niyet için benzersiz kimliği kullanarak bekleyen niyet oluşturma

4) sizin bildirim oluşturun:

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

Güzel bitti dostum! –

+0

Benim için işe yaramadı, her zaman "Alıcı başlatılamıyor ... sıfır argüman kurucusu yok" hatasıyla sonuçlandı. Sadece benzer bir çözümü uyguladıktan sonra ancak yayın alıcısını kaydettirdikten sonra çözüldü: http://stackoverflow.com/questions/13028122/how-to-use-delete-intent-to-perform-some-action-on -clear-notification –

+0

Bu benim için çalışır. Ancak, bildirimi tıkladığınızda etkinlik başlatılamaz. Tıklama olayını dinleyebilir miyim? –

0

Başka Fikir:

i f bir bildirimde bulunursanız normalde bir, iki veya 3 eylemine de ihtiyacınız vardır. Bir "NotifyManager" yarattım, ihtiyacım olan tüm bildirimleri oluşturuyor ve tüm Niyetli çağrıları alıyor. Bu yüzden tüm eylemleri yönetebilirim ve ayrıca işten çıkarma olayını tek bir yerde yakalayabilirim.

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; 
} 

ve ben (NotificationManager olarak) böyle silme Niyet ayarlamak için kullanın OLDUĞUNU:

public class NotifyPerformService extends IntentService { 

@Inject NotificationManager notificationManager; 

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

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

deleteIntent (NotificationManager değil) bu kullanmak oluşturmak için

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; 
} 

ve son olarak aynı NotificationManager'da gerçekleştirme işlevi şöyledir:

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 
} 
İlgili konular