Como limpar uma notificação no Android

96

É possível limpar uma notificação programaticamente?

Eu tentei com o, NotificationManagermas não está funcionando. Existe alguma outra maneira de fazer isso?

Rahul
fonte
12
É possível limpar suas próprias notificações, mas não as de outra pessoa
Donal Rafferty,
1
Sim, concordo com Donal para parte do código, consulte androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad
Consulte esta resposta para ver uma maneira de limpar outras notificações para API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Respostas:

227

Use o seguinte código para cancelar uma Notificação:

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);

Neste código existe sempre o mesmo id usado para notificações. Se você tiver notificações diferentes que precisam ser canceladas, você deve salvar os ids usados ​​para criar a notificação.

Janusz
fonte
9
Não sei por que isso não é mais votado e selecionado como a resposta. Essa era a solução que eu procurava. Obrigado!
loeschg
3
Qual deve ser o ID de notificação aqui?
Deepak
Isso realmente funciona. Mas, depois de cancelar uma notificação, todas as notificações subsequentes não mostram o texto da mensagem de notificação (que eu defini usando setContentText), embora eu defina a prioridade para 2. Alguma sugestão?
Iqbal
Não funciona se o sinalizador de notificação estiver definido como Notification.FLAG_NO_CLEAR
Anand Savjani
2
para todos e se você não souber qual id, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet
42

De: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Para limpar a notificação da barra de status quando o usuário a seleciona na janela Notificações, adicione o sinalizador "FLAG_AUTO_CANCEL" ao seu objeto Notificação. Você também pode limpá-lo manualmente com cancel (int), passando o ID de notificação ou limpar todas as suas Notificações com cancelAll ().

Mas Donal está certo, você só pode limpar as notificações que criou.

Chuck C.
fonte
11
Isso não cancelará uma notificação programaticamente.
Janusz
4
não tenho certeza do que Janusz está falando, mas cancel (id) e cancelAll () certamente funcionam
Andrew G
32

Já que ninguém postou uma resposta em código para isso:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. e se você já tem sinalizadores, você pode OR FLAG_AUTO_CANCEL assim:

notification.flags = Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL;
NPike
fonte
4
É melhor assim:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak
Alguém poderia explicar por que é melhor assim?
Prof
@Prof É menos código para a mesma finalidade e não tem impacto no desempenho.
Denny
1
@Denny Isso pressupõe que o primeiro sinalizador de notificação é definido acima, portanto, são duas linhas em vez de uma linha
Prof
20

Tente o método padrão fornecido no NotificationManager .

NotificationManager.cancelAll()para remover todas as notificações. NotificationManager.cancel(notificationId)para remover uma notificação específica.

Rohit Suthar
fonte
1
Caso alguém esteja travando no NotificationManager sem um cancelmétodo, o cancelmétodo não é estático, então você precisa de uma instância NotificationManagercomo esta: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Então você pode chamar notificationManager.cancel(notificationId);como Rohit Suthar referenciado em sua resposta. notificationIdé simplesmente o ID para o qual você passounotificationManager.notify(notificationId, mNotification)
Mira_Cole
8

A partir da API de nível 18 (Jellybean MR2), você pode cancelar notificações que não sejam as suas por meio de NotificationListenerService.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class MyNotificationListenerService extends NotificationListenerService {...}

...

private void clearNotificationExample(StatusBarNotification sbn) {
    myNotificationListenerService.cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
Jim Vitek
fonte
5
 Notification mNotification = new Notification.Builder(this)

                .setContentTitle("A message from: " + fromUser)
                .setContentText(msg)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.app_icon)
                .setContentIntent(pIntent)
                .build();

.setAutoCancel (true)

quando você clica na notificação, abre a atividade correspondente e remove a notificação da barra de notificação

Neeraj Singh
fonte
4

Se você estiver gerando notificação de um serviço que é iniciado em primeiro plano usando

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Em seguida, emitindo

notificationManager.cancel(NOTIFICATION_ID);

não acaba cancelando a Notificação, e a notificação ainda aparece na barra de status. Neste caso específico, você precisará emitir

stopForeground( true );

de dentro do serviço para colocá-lo de volta no modo de segundo plano e cancelar simultaneamente as notificações. Como alternativa, você pode colocá-lo em segundo plano sem que ele cancele a notificação e, em seguida, cancele a notificação.

stopForeground( false );
notificationManager.cancel(NOTIFICATION_ID);
Ian Gough
fonte
3

Se você estiver usando NotificationCompat.Builder(uma parte de android.support.v4), basta chamar o método de seu objetosetAutoCancel

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);

Alguns caras relataram que setAutoCancel()não funcionou para eles, então você também pode tentar desta forma

builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;

Observe que o método getNotification()está obsoleto !!!

sandalone
fonte
A pergunta perguntava como limpá-lo programaticamente. setAutoCancel () apaga quando o usuário clica na Notificação. developer.android.com/reference/android/support/v4/app/…
S Fitz
@SFitz Não fica claro com a pergunta o que ele quer. Eu entendi que ele deseja limpar a notificação quando um usuário clicar nele.
sandalone
1
    // Get a notification builder that's compatible with platform versions
    // >= 4
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            this);
    builder.setSound(soundUri);
    builder.setAutoCancel(true);

isso funciona se você estiver usando um construtor de notificação ...

user2962552
fonte
1

Na verdade, conforme respondido antes de começar com a API de nível 18, você pode cancelar notificações postadas por outros aplicativos diferentes do seu usando NotificationListenerService, mas essa abordagem não funcionará mais no Lollipop. Aqui está uma maneira de remover notificações que abrangem também a API Lillipop.

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}
Alejandro Casanova
fonte
Não consigo encontrar o método o cancelNotificationque é?
Denny
É um método da classe NotificationListenerService, verifique a documentação oficial developer.android.com/reference/android/service/notification/…
Alejandro Casanova
Como posso usar fora do serviço?
Denny
0

Todas as notificações (mesmo outras notificações de aplicativo) podem ser removidas ouvindo 'NotificationListenerService' conforme mencionado na Implementação de NotificationListenerService

No serviço você tem que ligar cancelAllNotifications().

O serviço deve ser habilitado para seu aplicativo através de:

'Aplicativos e notificações' -> 'Acesso especial a aplicativos' -> 'Acesso a notificações'.

Samantha
fonte
0

este código funcionou para mim:

public class ExampleReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}
Wilson
fonte
0

Acredito que o mais RECENTE e ATUALIZADO para AndroidX e compatibilidade com versões anteriores. A melhor maneira de fazer isso (Kotlin e Java) deve ser:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Ou para cancelar todas as notificações:

NotificationManagerCompat.from(context).cancelAll()

Feito para AndroidX ou bibliotecas de suporte.

Xenolion
fonte