2012-10-25 12 views
7

Android: Sto tentando di annullare una notifica dalla barra di notifica dopo l'installazione di un pacchetto. Quello che sto facendo è la seguente:NotificationManager.cancel (id) non funziona all'interno di un destinatario di broadcast

public class MyBroadcastReceiver extends BroadcastReceiver { 

       private static final String TAG = "MyBroadcastReceiver"; 

       @Override 
       public void onReceive(Context context, Intent intent) { 
        String action = intent.getAction(); 
        if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { 
         Uri data = intent.getData(); 
         //some code goes here 
         //get the id of the notification to cancel in some way 
         notificationhelper._completeNotificationManager.cancel(id);  
         } 
       } 
      } 

dove

public class notificationhelper { 
    public static NotificationManager _completeNotificationManager = null; 

    public void complete() {   
     if (_completeNotificationManager == null) 
      _completeNotificationManager = (NotificationManager) _context.getSystemService(Context.NOTIFICATION_SERVICE); 
      Notification notification = new Notification(
       R.drawable.notification, 
       _context.getString(R.string.notification), 
       System.currentTimeMillis()); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     notification.flags |= Notification.FLAG_NO_CLEAR; 
     _completeNotificationManager.notify(TEXT, id, notification); 
    } 
} 

Ma la notificationhelper._completeNotificationManager.cancel(id) non funziona. Ho provato a usare notificationhelper._completeNotificationManager.cancelAll(); e funziona. Cosa sto facendo di sbagliato?

risposta

9

Beh, questo è probabilmente irrilevante a questo punto, ma dovrebbe essere pubblicato qui in modo che le persone come me che affrontano lo stesso problema possano trovare la soluzione.

Se NotificationManager.cancel() non funziona, provare a modificare l'ID per la notifica.

notificationManager.notify(NOTIFICATION_ID, notification); 

Quando ho cambiato NOTIFICATION_ID da 1 a [RANDOM_NUMBER], magicamente ha cominciato a lavorare. Suppongo che 1 è in qualche modo riservato, anche se non c'è nessuna nota in tutta la documentazione ...

Un naturalmente assicurarsi di utilizzare lo stesso NOTIFICATION_ID per annullare:

notificationManager.cancel(NOTIFICATION_ID); 
+0

Mi stavo grattando la testa per lo stesso problema. stackoverflow.com/questions/38880330 Salvato la mia giornata. – mauron85

+0

puoi caricare il codice completo ho lo stesso problema? –

+0

sto generando un numero casuale di 7 cifre un avviso di notifica non funziona:/ –

15

Nella mia esperienza, si puo' t annulla tutte le notifiche con un ID particolare, indipendentemente dal tag.

Cioè, se si creano due notifiche in questo modo:

notificationManager.notify(TAG_ONE, SAME_ID, notification_one); 
notificationManager.notify(TAG_TWO, SAME_ID, notification_two); 

Poi, notificationManager.cancel(SAME_ID) non annulleremo uno di loro! Sospetto che questo sia dovuto al campo "tag", se non specificato in notify() e cancel(), il valore predefinito è null, che devi annullare esplicitamente.

Così, per annullare queste due notifiche, devi chiamare:

notificationManager.cancel(TAG_ONE, SAME_ID); 
notificationManager.cancel(TAG_TWO, SAME_ID); 

Nel tuo caso, si intende inserire "testo" come il tag, ma annullando semplicemente utilizzando il ID, che di default ad usare tag = null.

Quindi, o non fornire un testo come il tag:

_completeNotificationManager.notify(id, notification); 

Oppure, se avete bisogno di notifiche separati e non si desidera loro di clobber l'altro, tenere traccia dei tag attivi:

_completeNotificationManager.notify(TEXT, id, notification); 
collectionOfActiveTags.add(TEXT); 

... 

for (String activeTag : collectionOfActiveTags)  
    notificationhelper._completeNotificationManager.cancel(activeTag, id); 

Mi piacerebbe che quello che stai cercando di fare fosse supportato, come sembra che dovrebbe essere.

+0

("non è possibile annullare tutte le notifiche con un ID particolare") Nota ... è possibile, perché è necessario inserire un "tag unic to all notif" con un identificativo unic per ogni notifica. – delive

0

Mi trovavo di fronte allo stesso problema di recente. Sono riuscito a risolverlo

Quindi da quello che ho capito.

1) utilizzare l'id che è in pratica un numero casuale per notificare e inviare questo stesso id al codice (destinatario/attività ...) in cui si desidera annullarlo.

2) Quando si utilizzano i tag, sembra non funzionare per me dato che stavo dando un tag a tutte le notifiche ma con ID univoco.Ha funzionato solo sul primo tag. quindi ho completamente evitato di usare i tag. Se si desidera utilizzare i tag, emettere tag univoci insieme all'ID univoco e usarli entrambi durante la cancellazione.

risposta così definitiva ... quello che ho usato e quello che funziona per me:

STEP 1: 
int notif_id = (int)(System.currentTimeMillis()%10000); 

STEP2: add this id inside the action intent (I am launching an activity where the notification gets cancelled on the action click): 

       Intent notificationSettingsIntent = new Intent(context.getApplicationContext(), NotificationSettingsActivity.class); 
       notificationSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       notificationSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
       notificationSettingsIntent.putExtra("fromNotification",true); 
       notificationSettingsIntent.putExtra("notif_id",notif_id); 
       PendingIntent notificationSettingsActivityPendingIntent = PendingIntent.getActivity(context,notif_id,notificationSettingsIntent,PendingIntent.FLAG_ONE_SHOT); 

STEP 3: notify using the id in the step 1 but with no tags 

NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext()); 

notificationCompat.notify(notif_id,notificationBuilder.build()); 

Ora nell'attività che viene aperto da mia azione clic, annullo la notifica come:

NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext()); 

notificationCompat.cancel(getIntent().getIntExtra("notif_id")); 

Funziona ogni volta.

0

Le mie notifiche non sono state rimosse perché il mio servizio era Servizio in primo piano e NON un servizio regolare avviato da StartService.

Se il servizio è in primo piano, chiamare stopForeground(true) anziché stopelf(). Così ora il mio codice è simile al seguente:

NotificationManagerCompat.from(this).cancel(NotificationHelper.PLAYER_NOTIFICATION_ID); 
stopForeground(true); 

e ha funzionato, la notifica è stato rimosso.