2012-10-25 9 views
7

Android: Ich versuche, eine Benachrichtigung aus der Benachrichtigungsleiste nach der Installation eines Pakets abzubrechen. Was ich tue, ist die folgende:NotificationManager.cancel (id) funktioniert nicht in einem Broadcast-Empfänger

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

wo

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

Aber die notificationhelper._completeNotificationManager.cancel(id) funktioniert nicht. Ich habe versucht, notificationhelper._completeNotificationManager.cancelAll(); zu verwenden, und es funktioniert. Was mache ich falsch?

Antwort

9

Nun, dies ist wahrscheinlich an dieser Stelle irrelevant, aber es sollte hier veröffentlicht werden, so dass Leute wie ich, die mit dem gleichen Problem beschäftigen, die Lösung finden könnten.

Wenn NotificationManager.cancel() nicht funktioniert, versuchen Sie, die ID für die Benachrichtigung zu ändern.

notificationManager.notify(NOTIFICATION_ID, notification); 

Wenn ich NOTIFICATION_ID von 1 bis [RANDOM_NUMBER] geändert, begann es auf magische Weise zu arbeiten. Ich gehe davon aus, dass ein irgendwie reserviert ist, obwohl es keinen Hinweis in jeder Dokumentation ist ...

Ein natürlich sicherstellen, dass Sie die gleiche NOTIFICATION_ID verwenden abzubrechen:

notificationManager.cancel(NOTIFICATION_ID); 
+0

Ich kratzte mich am selben Problem. stackoverflow.com/questions/38880330 Sparte meinen Tag. – mauron85

+0

können Sie den vollständigen Code hochladen ich habe das gleiche Problem? –

+0

ich eine Zufallszahl von 7 erzeuge eine Still Benachrichtigung Concel funktioniert nicht:/ –

15

Nach meiner Erfahrung kann man‘ t alle Benachrichtigungen mit einer bestimmten ID unabhängig vom Tag abbrechen.

Das heißt, wenn Sie zwei Meldungen erstellen wie folgt:

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

Dann notificationManager.cancel(SAME_ID) wird auch nicht von ihnen kündigen! Ich vermute, dass dies daran liegt, dass das Feld "tag", wenn es in notify() und cancel() nicht angegeben ist, standardmäßig auf null gesetzt ist, was Sie explizit abbrechen müssen.

Also, diese beiden Mitteilungen zu löschen, müssen Sie rufen:

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

In Ihrem Fall sind Sie „TEXT“ als Tag liefern aber Cancelling nur die ID verwenden, die standardmäßig auf-Tag = null.

also entweder nicht bieten TEXT als tag:

_completeNotificationManager.notify(id, notification); 

Oder, wenn Sie separate Meldungen benötigen und wollen sie nicht, einander verprügeln, den Überblick über die aktiven Tags:

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

... 

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

Ich wünschte, dass das, was Sie versuchen, wurde unterstützt, wie es scheint, dass es sein sollte.

+0

("Sie können nicht alle Benachrichtigungen mit einer bestimmten ID abbrechen") Hinweis ... Sie können, weil benötigen Sie ein "Tag Unic zu allen Notif" mit einer ID Unic zu jeder notificacions. – delive

0

Ich hatte vor kurzem das gleiche Problem. Ich habe es geschafft, es zu lösen.

Also von was ich verstanden habe.

1) Verwenden Sie die ID, die im Grunde eine Zufallszahl ist, zu benachrichtigen und senden Sie diese ID an das Stück Code (Empfänger/Aktivität ...), wo Sie es abbrechen möchten.

2) Bei der Verwendung von Tags scheint es für mich nicht zu funktionieren, da ich allen Benachrichtigungen ein Tag gab, aber mit einer eindeutigen ID.Es funktionierte nur beim ersten Tag. also habe ich es komplett vermieden, Tags zu verwenden. Wenn Sie Tags verwenden möchten, geben Sie eindeutige Tags zusammen mit einer eindeutigen ID aus und verwenden Sie beide beim Abbrechen.

So endgültige Antwort ..., was ich verwenden und was für mich:

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

Jetzt in der Aktivität, die durch meine Aktion Klick geöffnet wird, kündige ich die Benachrichtigung als:

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

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

Funktioniert jedes Mal jetzt.

0

Meine Benachrichtigungen wurden nicht entfernt, da mein Dienst Foreground Service war und KEIN regulärer Dienst, der von StartService gestartet wurde.

Wenn Ihr Dienst im Vordergrund ist, rufen Sie stopForeground(true) statt stopself(). So jetzt sieht mein Code wie folgt aus:

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

und es funktionierte, Benachrichtigung wurde entfernt.

Verwandte Themen