Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I avoid blinking notification update while changing button

I have a Notification, which supports play,pause forward and back.

private static Notification createNotification(String interpret, String title, boolean paused) { //  if (builder == null)        builder = new NotificationCompat.Builder(context);      builder.setPriority(Notification.PRIORITY_MAX);     builder.setAutoCancel(false);     builder.setContentTitle(title);     builder.setContentText(interpret);     builder.setOngoing(true);     builder.setOnlyAlertOnce(true);     builder.setSmallIcon(R.drawable.ic_launcher);     builder.setContentIntent(PendingIntent.getActivity(context, 9, new Intent(context, ApplicationActivity.class), Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT));     builder.addAction(R.drawable.av_previous, "", PendingIntent.getBroadcast(context.getApplicationContext(), 0, new Intent(NotificationPlayerControlReceiver.MUSIC_PLAYER_INTENT).putExtra("resultcode", NotificationPlayerControlReceiver.PREVIOUS), PendingIntent.FLAG_CANCEL_CURRENT));      if (paused)         builder.addAction(R.drawable.av_play, "", PendingIntent.getBroadcast(context.getApplicationContext(), 2, new Intent(NotificationPlayerControlReceiver.MUSIC_PLAYER_INTENT).putExtra("resultcode", NotificationPlayerControlReceiver.PLAY), PendingIntent.FLAG_CANCEL_CURRENT));     else         builder.addAction(R.drawable.av_pause, "", PendingIntent.getBroadcast(context.getApplicationContext(), 3, new Intent(NotificationPlayerControlReceiver.MUSIC_PLAYER_INTENT).putExtra("resultcode", NotificationPlayerControlReceiver.PAUSE), PendingIntent.FLAG_CANCEL_CURRENT));      builder.addAction(R.drawable.av_next, "", PendingIntent.getBroadcast(context.getApplicationContext(), 1, new Intent(NotificationPlayerControlReceiver.MUSIC_PLAYER_INTENT).putExtra("resultcode", NotificationPlayerControlReceiver.NEXT), PendingIntent.FLAG_CANCEL_CURRENT));      Notification notification = builder.build();      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)         notification.tickerView = null;      return notification; } 

Updating the notification:

 public static void update(String interpret, String title, boolean paused) {     NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);     manager.notify(0, createNotification(interpret, title, paused)); } 

To avoid blinking on update, I´ve set the builder to a global variable and I reuse it on every update, which works great. but reusing it, means that also all buttons I´ve added are reused and there is no possibility to remove Actions I´ve added before.

The button change only works, if I reinitialize the NotificationCompat.Builder on every update, which means I get the blinking again.

How do I avoid blinking, but letting the button change?

EDIT: Just checked out Rocket Player, they didn´t solve the problem too, but Google Play Music did

like image 955
Marian Klühspies Avatar asked Sep 26 '13 09:09

Marian Klühspies


1 Answers

Like Boris said, the problem is that a new notification will be build every update. My solution covers the same logic, but I use the NotificationBuilder...

here is the code:

if (mNotificationBuilder == null) {             mNotificationBuilder = new NotificationCompat.Builder(this)                     .setSmallIcon(iconId)                     .setContentTitle(title)                     .setContentText(message)                     .setLargeIcon(largeIcon)                     .setOngoing(true)                     .setAutoCancel(false);         } else {             mNotificationBuilder.setContentTitle(title)                     .setContentText(message);         } 

keep in mind that mNotificationBuilder is a private field in the class.

like image 157
Martin Pfeffer Avatar answered Nov 05 '22 04:11

Martin Pfeffer