зловити пальцем, щоб скасувати подію


85

Я використовую сповіщення android, щоб попередити користувача після завершення служби (успіх чи невдача), і я хочу видалити локальні файли після завершення процесу.

Моя проблема полягає в тому, що у випадку відмови - я хочу дозволити користувачеві опцію "повторити спробу". а якщо він вирішить не повторити спробу та відхилити повідомлення, я хочу видалити локальні файли, збережені для цілей процесу (зображення ...).

Чи можна зафіксувати подію, яку потрібно відхилити, щоб провести сповіщення?

Відповіді:


144

DeleteIntent : DeleteIntent - це об’єкт PendingIntent, який може бути пов’язаний із сповіщенням і запускається, коли сповіщення видаляється, ефір за допомогою:

  • Дія користувача
  • Користувач Видалити всі сповіщення.

Ви можете встановити Очікуючий намір як транслятор, а потім виконати будь-яку потрібну дію.

  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
Це вже пізно. Мені просто цікаво, чи існує схожий підхід до сповіщень, які мали місце builder.setAutoCancel(true);, коли користувач натискає сповіщення, і воно скасовується, delete-Intent не запускається
devanshu_kaushik


Так, він працює нормально, але не в Oreo та вище API. Будь ласка, допоможіть мені за Орео
Пітер,

@Peter Щоб змусити його працювати в Oreo та Obove, вам потрібно додати цей рядок коду: Примітка до сповіщення = builder.build (); note.flags | = Повідомлення.FLAG_AUTO_CANCEL;
Дімас Мендес,

86

Повністю змита відповідь (з подякою містеру Меню за відповідь):

1) Створіть приймач, щоб обробляти подію, яку потрібно провести пальцем:

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) Додайте запис до свого маніфесту:

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

3) Створіть очікуваний намір, використовуючи унікальний ідентифікатор для очікуваного наміру (тут використовується ідентифікатор сповіщення), оскільки без цього ті самі додаткові матеріали будуть використані повторно для кожної події звільнення:

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) Створіть своє сповіщення:

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

Не спрацював у мене, завжди спричиняв помилку "Неможливо створити екземпляр одержувача .... не має конструктора нульових аргументів". Вирішено лише після того, як я застосував ще одне подібне рішення, але з реєстрацією приймача мовлення: stackoverflow.com/questions/13028122/…
Алексєєв Валерій

Це працює для мене. Але подія не може бути викликана, коли ви натискаєте сповіщення. Як я можу прослухати подію кліку?
Аллен Ворк,

Згідно з документами, якщо ви використовуєте setAutoCancel(true), то сповіщення буде скасовано при натисканні, а також транслюватиме намір видалення [ developer.android.com/reference/android/support/v4/app/…
sven

Це працює, крім передачі параметра, intent.getExtras () завжди повертає значення null, навіть якщо встановлені додаткові функції. Щоб вона працювала, потрібно встановити дію так: resultIntent.setAction (unique_action);
lxknvlk

0

Ще одна ідея:

якщо ви зазвичай створюєте повідомлення, вам також потрібні дії, одна, дві або три з них. Я створив "NotifyManager", він створює всі потрібні мені сповіщення, а також отримує всі дзвінки за намірами. Тож я можу керувати всіма діями, а також ловити подію звільнення в ОДНОМУ місці.

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):

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

та ЩО я використовую для встановлення такого наміру видалення (у 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;
}

і, нарешті, у тому ж NotificationManager є функція виконувати:

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.