Обновляет ли уведомление уведомление о статусе переднего плана службы?
В моем приложении я размещаю свою службу на переднем плане, чтобы предотвратить ее с помощью:
startForeground(NOTIFY_ID, notification);
Это также отображает уведомление пользователю (что отлично). Проблема в том, что позже мне нужно обновить уведомление. Поэтому я использую код:
notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent);
mNotificationManager.notify(NOTIFY_ID, notification);
Возникает вопрос: будет ли это вызывать из Сервиса особый статус переднего плана?
В этом ответе CommonsWare указывает, что такое поведение возможно, но он не уверен. Так кто-нибудь знает фактический ответ?
Примечание. Я знаю, что простой способ избавиться от этого вопроса - неоднократно называть startForeground()
каждый раз, когда я хочу обновить уведомление. Я хочу знать, будет ли работать эта альтернатива.
Ответы
Ответ 1
Приложение RandomMusicPlayer (в архиве) на сайте разработчиков Android использует NotificationManager для обновления уведомлений службы переднего плана, поэтому весьма вероятно, что она сохраняет состояние переднего плана.
(См. SetUpAsForeground() и updateNotification() в классе MusicService.java.)
Насколько я понимаю, если вы отмените уведомление, сервис перестанет быть приоритетным, так что имейте это в виду; Если вы отмените уведомление, вам нужно будет снова вызвать startForeground(), чтобы восстановить статус переднего плана службы.
Ответ 2
Чтобы прояснить сказанное здесь:
Из того, что я понимаю, если вы отмените уведомление, служба перестанет быть передним планом, поэтому имейте это в виду; если вы отмените уведомление, вам нужно снова вызвать startForeground() для восстановления статуса переднего плана службы.
В этой части ответа предлагается удалить текущий Notification
, установленный Service
, с помощью NotificationManager.cancel()
на постоянном Notification
.
Это неправда.
Невозможно удалить текущее уведомление, установленное startForeground()
, с помощью NotificationManager.cancel()
.
Единственный способ удалить его - вызывать stopForeground(true)
, поэтому текущее уведомление удаляется, что также приводит к тому, что Service
перестает находиться на переднем плане. Так что это наоборот наоборот; Service
не останавливается на переднем плане, так как Notification
отменяется, Notification
можно отменить, остановив Service
на переднем плане.
Естественно, после этого сразу можно было бы вызвать startForeground()
, чтобы восстановить состояние с помощью нового Notification
. Одна из причин, по которой вы хотели бы сделать это, если текст тикера должен быть показан снова, потому что он будет работать только при первом отображении Notification
.
Это не документировано, и я потратил 4 часа на то, чтобы выяснить, почему я не смог удалить Notification
.
Подробнее об этом здесь: NotificationManager.cancel() не работает для меня
Ответ 3
Если вы хотите обновить набор уведомлений startForeground(), просто создайте новое уведомление и затем используйте NotificationManager, чтобы уведомить об этом.
Ключевым моментом является использование одного и того же идентификатора уведомления.
Обновление уведомления НЕ удалит службу из состояния переднего плана (это можно сделать только путем вызова stopForground);
Пример:
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);
}