Does updating a Notification remove a Service's foreground status?
To clarify what has been said here:
From what I understand, if you cancel the notification the service will cease being a foreground service, so keep that in mind; if you cancel the notification, you'll need to call startForeground() again to restore the service's foreground status.
This part of the answer suggest it is possible to remove an ongoing Notification
set by a Service
by using NotificationManager.cancel()
on the persistent Notification
.
This is not true.
It's impossible to remove a ongoing notification set by startForeground()
by using NotificationManager.cancel()
.
The only way to remove it, is to call stopForeground(true)
, so the ongoing Notification is removed, which ofcourse also makes the Service
stop being in the foreground. So it's actually the other way around; the Service
doesn't stop being in the foreground because the Notification
is cancelled, the Notification
can only be cancelled by stopping the Service
being in the foreground.
Naturally one could call startForeground()
after this right away, to restore the state with a new Notification
. One reason you would want to do this if a ticker text has to be shown again, because it will only run the first time the Notification
is displayed.
This behaviour is not documented, and I wasted 4 hours trying to figure out why I couldn't remove the Notification
.
More on the issue here: NotificationManager.cancel() doesn't work for me
The RandomMusicPlayer (archived) app at the Android developer site uses NotificationManager to update the notification of a foreground service, so chances are pretty good that it retains the foreground status.
(See setUpAsForeground() and updateNotification() in the MusicService.java class.)
From what I understand, if you cancel the notification the service will cease being a foreground service, so keep that in mind; if you cancel the notification, you'll need to call startForeground() again to restore the service's foreground status.
When you want to update a Notification set by startForeground(), simply build a new notication and then use NotificationManager to notify it.
The key point is to use the same notification id.
Updating the Notification will NOT remove the Service from the foreground status (this can be done only by calling stopForground );
Example:
private static final int notif_id=1;
@Override
public void onCreate (){
this.startForeground();
}
private void startForeground() {
startForeground(notif_id, getMyActivityNotification(""));
}
private Notification getMyActivityNotification(String text){
// The PendingIntent to launch our activity if the user selects
// this notification
CharSequence title = getText(R.string.title_activity);
PendingIntent contentIntent = PendingIntent.getActivity(this,
0, new Intent(this, MyActivity.class), 0);
return new Notification.Builder(this)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.ic_launcher_b3)
.setContentIntent(contentIntent).getNotification();
}
/**
this is the method that can be called to update the Notification
*/
private void updateNotification() {
String text = "Some text that will update the notification";
Notification notification = getMyActivityNotification(text);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notif_id, notification);
}