etkinliği kapatmak için hızlıca kaydır


85

Bir hizmet bittiğinde (başarılı veya başarısız) kullanıcıyı uyarmak için bir android bildirimi kullanıyorum ve işlem tamamlandığında yerel dosyaları silmek istiyorum.

Benim sorunum şu ki, başarısızlık durumunda - kullanıcıya "yeniden deneme" seçeneği vermek istiyorum. ve tekrar denememeyi ve bildirimi reddetmeyi seçerse, işlem amaçları için kaydedilmiş yerel dosyaları (resimler ...) silmek istiyorum.

Bildirimin kaydırarak kapat etkinliğini yakalamanın bir yolu var mı?

Yanıtlar:


145

DeleteIntent : DeleteIntent bir bildirim ile ilişkilendirilebilir ve bildirim silindiğinde ile eter, ateş alan bir PendingIntent amacıdır:

  • Kullanıcıya özel eylem
  • Kullanıcı Tüm bildirimleri silin.

Bekleyen Niyeti bir yayın Alıcısı olarak ayarlayabilir ve ardından istediğiniz eylemi gerçekleştirebilirsiniz.

  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
         }

  }

8
Bu geç. builder.setAutoCancel(true);Bir kullanıcı bildirimi tıkladığında ve iptal edildiğinde ortaya çıkan bildirimler için benzer bir yaklaşım olup olmadığını merak ediyordum , silme-Niyeti tetiklenmedi
devanshu_kaushik


@Peter Oreo ve Obove'da çalışmasını sağlamak için şu kod satırını eklemeniz gerekir: Notification note = builder.build (); note.flags | = Notification.FLAG_AUTO_CANCEL;
Dimas Mendes

86

Tamamen açık bir cevap (cevap için Bay Me'ye teşekkürler):

1) Kapatmak için kaydır olayını işlemek için bir alıcı oluşturun:

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

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

3) Bekleyen niyet için benzersiz bir kimlik kullanarak bekleyen amacı oluşturun (burada bildirim kimliği kullanılır), çünkü bu olmadan aynı ekstralar her işten çıkarma olayı için yeniden kullanılacaktır:

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) Bildiriminizi 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);

Benim için işe yaramadı, her zaman "Alıcı başlatılamıyor .... sıfır bağımsız değişken oluşturucuya sahip değil" hatasıyla sonuçlandı. Yalnızca benzer başka bir çözümü uyguladıktan sonra ancak yayın alıcısının kaydedilmesiyle çözüldü: stackoverflow.com/questions/13028122/…
Alexeev Valeriy

Bu benim için çalışıyor ancak bildirime tıkladığınızda olay çağrılamıyor. Click olayını nasıl dinleyebilirim?
Allen Vork

Eğer kullanırsanız Docs göre setAutoCancel(true), bildirim silme niyet [yayın da tıklandığında iptal edilecek ve developer.android.com/reference/android/support/v4/app/...
sven

Bu çalışır, parametre geçişi dışında, intent.getExtras () ekstralar ayarlanmış olsa bile her zaman null döndürür. Çalışması için, şu şekilde eylem ayarlamanız gerekir: resultIntent.setAction (unique_action);
lxknvlk

0

Diğer bir fikir:

Normalde bir bildirim oluşturursanız, bir, iki veya 3 eylemine de ihtiyacınız vardır. İhtiyacım olan tüm bildirimleri oluşturan ve ayrıca tüm Amaç çağrılarını alan bir "NotifyManager" oluşturdum. Böylece tüm eylemleri yönetebilir VE ayrıca işten çıkarma olayını TEK bir yerde yakalayabilirim.

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 oluşturmak için bunu kullanın (NotificationManager'da):

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 silme amacını şu şekilde ayarlamak için kullandığım (NotificationManager'da):

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ştir işlevi bulunur:

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.