Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Notification is not being dismissed (Android)

Notification setAutoCancel(true) doesn't work if clicking on Action

I have a notification with an action within it. When I tap on the notification it gets removed from the list. However, when I click on the Action it successfully completes the Action (namely makes a call), but when I return to the list of notifications, it remains there. Relative code of the AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver {
Meeting meeting;

/**
 * Handle received notifications about meetings that are going to start
 */
@Override
public void onReceive(Context context, Intent intent) {

    // Get extras from the notification intent
    Bundle extras = intent.getExtras();
    this.meeting = extras.getParcelable("MeetingParcel");

    // build notification pending intent to go to the details page when click on the body of the notification
    Intent notificationIntent = new Intent(context, MeetingDetails.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    notificationIntent.putExtra("MeetingParcel", meeting);      // send meeting that we received to the MeetingDetails class
    notificationIntent.putExtra("notificationIntent", true);    // flag to know where the details screen is opening from

    PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

    // build intents for the call now button
    Intent phoneCall = Call._callIntent(meeting);
    if (phoneCall != null) {

        PendingIntent phoneCallIntent = PendingIntent.getActivity(context, 0, phoneCall, PendingIntent.FLAG_CANCEL_CURRENT);

        int flags = Notification.FLAG_AUTO_CANCEL;

        // build notification object
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        Notification notification = builder.setContentTitle("Call In")
                .setContentText(intent.getStringExtra("contextText"))
                .setTicker("Call In Notification")
                .setColor(ContextCompat.getColor(context, R.color.colorBluePrimary))
                .setAutoCancel(true)                    // will remove notification from the status bar once is clicked
                .setDefaults(Notification.DEFAULT_ALL)  // Default vibration, default sound, default LED: requires VIBRATE permission
                .setSmallIcon(R.drawable.icon_notifications)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(meeting.description))
                .addAction(R.drawable.icon_device, "Call Now", phoneCallIntent)
                .setCategory(Notification.CATEGORY_EVENT)   // handle notification as a calendar event
                .setPriority(Notification.PRIORITY_HIGH)    // this will show the notification floating. Priority is high because it is a time sensitive notification
                .setContentIntent(pIntent).build();

        notification.flags = flags;

        // tell the notification manager to notify the user with our custom notification
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notification);
    }
  }
}

enter image description here

like image 764
Async- Avatar asked Oct 30 '22 02:10

Async-


2 Answers

use this flag:

Notification.FLAG_AUTO_CANCEL inside this:

int flags = Notification.FLAG_AUTO_CANCEL;
Notification notification = builder.build();
        notification.flags = flags;

Documentation

like image 60
Vyacheslav Avatar answered Nov 15 '22 05:11

Vyacheslav


Ok turns out it's a known problem already, and it needs extra code to be done (keeping reference to notification through id). Have no clue why API does not provide this, as it seems very logical to do. But anyways,

see this answer in stackoverflow:

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?

like image 27
Async- Avatar answered Nov 15 '22 06:11

Async-