Обновляет ли уведомление уведомление о статусе переднего плана службы?

В моем приложении я размещаю свою службу на переднем плане, чтобы предотвратить ее с помощью:

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);
}