Я использую уведомление Android, чтобы предупредить пользователя о завершении службы (успех или сбой), и я хочу удалить локальные файлы после завершения процесса.
Моя проблема в том, что в случае сбоя - я хочу предоставить пользователю возможность «повторить попытку». и если он решит не повторять попытку и отклонить уведомление, я хочу удалить локальные файлы, сохраненные для целей процесса (изображения ...).
Есть ли способ поймать событие смахивания, чтобы отклонить уведомление?
источник
builder.setAutoCancel(true);
потому что, когда пользователь нажимает на уведомление, и оно отменяется, delete-Intent не запускаетсяПолностью продуманный ответ (с благодарностью Mr. Me за ответ):
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);
источник
setAutoCancel(true)
, то уведомление будет отменено при нажатии, а также будет транслироваться намерение удаления [ developer.android.com/reference/android/support/v4/app/…Другая идея:
если вы обычно создаете уведомление, вам также понадобятся действия один, два или три из них. Я создал «NotifyManager», он создает все необходимые мне уведомления, а также принимает все вызовы Intent. Таким образом, я могу управлять всеми действиями, а также ловить событие увольнения в ОДНОМ месте.
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 }
источник