How to cancel a foreground service from using the notification (swipe dismiss) or clear all notifications?

后端 未结 6 1337
伪装坚强ぢ
伪装坚强ぢ 2020-12-05 05:23

I\'m currently creating a foreground service with a notification that appears in the notification bar when the service starts. If the service stops, the notification dismiss

6条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-05 05:36

    The user is not allowed to swipe away a notification generated by an ongoing foreground service.

    Hence, stopForeground(false) first, which allows the notification to be swiped away by the user thereafter (at least on Lollipop+). For pre-Lollipop, you may have to stopForeground(true), which stops foreground and removes the notification, then re-issue the notification with notificationManager.notify(yourNotificationID, yourNotificationObject), so that your notification is visible but swipeable.

    Crucially, set up the notification object with a delete intent that is triggered when the user swipes it away.

    (new NotificationCompat.builder(this).setDeleteIntent(deletePendingIntent)).build()
    

    where deletePendingIntent is something like

    Intent deleteIntent = new Intent(this, YourService.class);
    deleteIntent.putExtra(someKey, someIntValue);
    PendingIntent deletePendingIntent = PendingIntent.getService(this,
    someIntValue, 
    deleteIntent, 
    PendingIntent.FLAG_CANCEL_CURRENT);
    

    When the user swipes it away, the intent with its extra is delivered to the service. Handle the delivered extra within onStartCommand, i.e. check that intent != null, intent.getExtras() != null, then extract the value from the extras bundle given someKey, and if it matches someIntValue, then call stopSelf().

提交回复
热议问题