У меня есть настройка службы переднего плана в Android. Я хочу обновить текст уведомления. Я создаю сервис, как показано ниже.
Как я могу обновить текст уведомления, настроенный в этой службе переднего плана? Как лучше всего обновить уведомление? Приветствуется любой образец кода.
public class NotificationService extends Service {
private static final int ONGOING_NOTIFICATION = 1;
private Notification notification;
@Override
public void onCreate() {
super.onCreate();
this.notification = new Notification(R.drawable.statusbar, getText(R.string.app_name), System.currentTimeMillis());
Intent notificationIntent = new Intent(this, AbList.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
this.notification.setLatestEventInfo(this, getText(R.string.app_name), "Update This Text", pendingIntent);
startForeground(ONGOING_NOTIFICATION, this.notification);
}
Я создаю сервис в своей основной деятельности, как показано ниже:
// Start Notification Service
Intent serviceIntent = new Intent(this, NotificationService.class);
startService(serviceIntent);
startService()
чтобы передать команду службе, просто позвоните ещеstartService()
раз, чтобы сообщить ей об обновлении текста. Или, если вы звонитеbindService()
, добавьте метод в свой API, чтобы служба обновила свой текст. Или подумайте, должна ли сама служба принимать решение, обновлять текст или нет. Или, возможно, текст является тем,SharedPeference
что у службы есть слушатель. Дать вам точный совет абстрактно невозможно.cancel()
установить уведомлениеstartForeground()
. Вы должны удалить приоритетный статус самой службы (используя,stopForeground()
если вы хотите, чтобы текст тикера появлялся снова. Я потерял часы, потому что эти ответы привели меня к мысли, что это действительно возможно.NotificationManager
сработало, как я ожидал.Если вы хотите обновить набор уведомлений с помощью startForeground (), просто создайте новое уведомление, а затем используйте NotificationManager, чтобы уведомить его.
Ключевым моментом является использование того же идентификатора уведомления.
Я не тестировал сценарий многократного вызова startForeground () для обновления уведомления, но думаю, что лучше использовать NotificationManager.notify.
Обновление Уведомления НЕ удаляет Службу из состояния переднего плана (это можно сделать только путем вызова stopForground);
Пример:
В документации указано
источник
notify()
илиstartForeground()
обоих приводит к вызовуonStartCommand()
.NotificationManager
для обновления уведомления, отображаемого с помощью,startForeground
заключается в том, что вызовstopForeground
больше не удаляет уведомление. Обновление с помощью другого вызоваstartForeground
устраняет эту проблему.Улучшение ответа Луки Манзо в Android 8.0+ при обновлении уведомления будет звучать и отображаться как предупреждение.
чтобы предотвратить это, вам нужно добавить
setOnlyAlertOnce(true)
так что код:
источник
new NotificationChannel
вот код для этого в вашем сервисе . Создайте новое уведомление, но попросите диспетчер уведомлений уведомить тот же идентификатор уведомления, который вы использовали в startForeground.
полные образцы кодов вы можете проверить здесь:
https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java
источник
not foreground
дляforeground created
сообщения.Кажется, что ни один из существующих ответов не показывает, как обрабатывать полный случай - startForeground, если это первый вызов, но обновлять уведомление для последующих вызовов.
Вы можете использовать следующий шаблон, чтобы определить правильный случай:
Кроме того, вам необходимо создать уведомление и канал, как в других ответах:
источник