Eu tenho uma configuração de serviço em primeiro plano no Android. Gostaria de atualizar o texto da notificação. Estou criando o serviço, como mostrado abaixo.
Como posso atualizar o texto de notificação configurado neste serviço em primeiro plano? Qual é a melhor prática para atualizar a notificação? Qualquer código de exemplo seria apreciado.
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);
}
Estou criando o serviço na minha atividade principal, como mostrado abaixo:
// Start Notification Service
Intent serviceIntent = new Intent(this, NotificationService.class);
startService(serviceIntent);
startService()
para passar um comando para o serviço, basta ligarstartService()
novamente para solicitar a atualização do texto. Ou, se você estiver chamandobindService()
, adicione um método à sua API para que o serviço atualize seu texto. Ou considere se o serviço em si deve ser quem decide se deve ou não atualizar o texto. Ou talvez o texto sejaSharedPeference
aquele em que o serviço tenha um ouvinte. É impossível fornecer conselhos precisos em resumo.cancel()
definir uma Notificação porstartForeground()
. Você tem que remover o status de primeiro plano da própria (usando o serviçostopForeground()
se você quiser fazer o texto ticker aparecer novamente eu perdi horas porque estas respostas me levou a acreditar que era na verdade possível..NotificationManager
funcionou como eu esperava.Quando você quiser atualizar um conjunto de Notificações por startForeground (), simplesmente crie uma nova observação e use o NotificationManager para notificá-la.
O ponto principal é usar o mesmo ID de notificação.
Não testei o cenário de chamar repetidamente startForeground () para atualizar a Notificação, mas acho que usar o NotificationManager.notify seria melhor.
A atualização da notificação NÃO removerá o serviço do status de primeiro plano (isso pode ser feito apenas chamando stopForground);
Exemplo:
A documentação declara
fonte
notify()
ou osstartForeground()
dois leva à chamadaonStartCommand()
.NotificationManager
para atualizar uma notificação mostradastartForeground
é que a chamadastopForeground
não removerá mais a notificação. Atualizá-lo com outra chamada parastartForeground
evitar esse problema.Ao melhorar a resposta de Luca Manzo no Android 8.0+, ao atualizar a notificação, ele emitirá som e será exibido como Heads-up.
para impedir que você precise adicionar
setOnlyAlertOnce(true)
então o código é:
fonte
new NotificationChannel
aqui está o código para fazê-lo em seu serviço . Crie uma nova notificação, mas solicite ao gerente de notificações para notificar o mesmo ID de notificação usado no startForeground.
para obter códigos de amostra completos, você pode conferir aqui:
https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java
fonte
not foreground
paraforeground created
mensagem.Parece que nenhuma das respostas existentes mostra como lidar com o caso completo - para iniciar o Foreground se for a primeira chamada, mas atualizar a notificação para as chamadas subseqüentes.
Você pode usar o seguinte padrão para detectar o caso correto:
Além disso, você precisa criar a notificação e o canal como em outras respostas:
fonte