catch on swipe to dismiss event
DeleteIntent:DeleteIntent is a PendingIntent object that can be associated with a notification and gets fired when the notification gets deleted, ether by :
- User specific action
- User Delete all the notifications.
You can set the Pending Intent to a broadcast Receiver and then perform any action you want.
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 } }
A fully flushed out answer (with thanks to Mr. Me for the answer):
1) Create a receiver to handle the swipe-to-dismiss event:
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) Add an entry to your manifest:
<receiver android:name="com.my.app.receiver.NotificationDismissedReceiver" android:exported="false" ></receiver>
3) Create the pending intent using a unique id for the pending intent (the notification id is used here) as without this the same extras will be reused for each dismissal event:
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) Build your notification:
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);
Another Idea:
if you create a notification normally you also need the actions one, two or 3 of them. I've created a "NotifyManager" it creates all notifications i need and also receive all Intent calls. So i can manage all the actions AND also the catch the dismiss event at ONE place.
public class NotifyPerformService extends IntentService {@Inject NotificationManager notificationManager;public NotifyPerformService() { super("NotifyService"); ...//some Dagger stuff}@Overridepublic void onHandleIntent(Intent intent) { notificationManager.performNotifyCall(intent);}
to create the deleteIntent use this (in the 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;}
and THAT i use to set the delete Intent like this (in the 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;}
and finally in the same NotificationManager is the perform function:
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}