How to dismiss notification after action has been clicked How to dismiss notification after action has been clicked android android

How to dismiss notification after action has been clicked


When you called notify on the notification manager you gave it an id - that is the unique id you can use to access it later (this is from the notification manager:

notify(int id, Notification notification)

To cancel, you would call:

cancel(int id)

with the same id. So, basically, you need to keep track of the id or possibly put the id into a Bundle you add to the Intent inside the PendingIntent?


Found this to be an issue when using Lollipop's Heads Up Display notification. See design guidelines. Here's the complete(ish) code to implement.

Until now, having a 'Dismiss' button was less important, but now it's more in your face.

heads up notification

Building the Notification

int notificationId = new Random().nextInt(); // just use a counter in some util class...PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);NotificationCompat.Builder builder = new NotificationCompat.Builder(context);builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style        .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission        .setSmallIcon(R.drawable.ic_action_refresh) // Required!        .setContentTitle("Message from test")        .setContentText("message")        .setAutoCancel(true)        .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)        .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);// Gets an instance of the NotificationManager serviceNotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);// Builds the notification and issues it.notifyMgr.notify(notificationId, builder.build());

NotificationActivity

public class NotificationActivity extends Activity {    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));        finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately    }    public static PendingIntent getDismissIntent(int notificationId, Context context) {        Intent intent = new Intent(context, NotificationActivity.class);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);        intent.putExtra(NOTIFICATION_ID, notificationId);        PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);        return dismissIntent;    }}

AndroidManifest.xml (attributes required to prevent SystemUI from focusing to a back stack)

<activity    android:name=".NotificationActivity"    android:taskAffinity=""    android:excludeFromRecents="true"></activity>


I found that when you use the action buttons in expanded notifications, you have to write extra code and you are more constrained.

You have to manually cancel your notification when the user clicks an action button. The notification is only cancelled automatically for the default action.

Also if you start a broadcast receiver from the button, the notification drawer doesn't close.

I ended up creating a new NotificationActivity to address these issues. This intermediary activity without any UI cancels the notification and then starts the activity I really wanted to start from the notification.

I've posted sample code in a related post Clicking Android Notification Actions does not close Notification drawer.