2012-10-25 15 views
7

Android: Próbuję anulować powiadomienie z paska powiadomień po zainstalowaniu pakietu. Co robię jest następujący:NotificationManager.cancel (id) nie działa wewnątrz odbiornika telewizyjnego

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

gdzie

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

Ale notificationhelper._completeNotificationManager.cancel(id) nie działa. Próbowałem użyć notificationhelper._completeNotificationManager.cancelAll(); i to działa. Co robię źle?

Odpowiedz

9

To chyba nie ma znaczenia w tym momencie, ale powinno być tutaj zamieszczone, aby ludzie tacy jak ja, zajmujący się tym samym problemem, mogli znaleźć rozwiązanie.

Jeśli nie działa NotificationManager.cancel(), spróbuj zmienić identyfikator powiadomienia.

notificationManager.notify(NOTIFICATION_ID, notification); 

Kiedy zmienił NOTIFICATION_ID od 1 do losowy_numer [], to magicznie rozpoczął pracę. Zakładam, że 1 jest jakoś zastrzeżone, chociaż nie ma notatki w każdej dokumentacji ...

oczywiście upewnij się, że korzystają z tego samego NOTIFICATION_ID aby anulować:

notificationManager.cancel(NOTIFICATION_ID); 
+0

Podrapałem się po tym samym problemie. stackoverflow.com/questions/38880330 Uratowałem mój dzień. – mauron85

+0

czy możesz przesłać pełny kod i mam ten sam problem? –

+0

Generuję losową liczbę 7 cyfr i nadal nie działa powiadomienie: nie ma zastosowania: –

15

w moim doświadczeniu, można” t anuluj wszystkie powiadomienia o określonym ID, niezależnie od tagu.

Oznacza to, że jeśli utworzyć dwa zawiadomienia tak:

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

Następnie notificationManager.cancel(SAME_ID) nie anulować żadnego z nich! Podejrzewam, że dzieje się tak dlatego, że pole "tag", jeśli nieokreślone w notify() i cancel(), domyślnie ma wartość null, którą trzeba wyraźnie anulować.

Tak, aby anulować te dwa zawiadomienia, trzeba zadzwonić:

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

W twoim przypadku, jesteś dostarczanie „tekst” jako znak, ale anulowanie tylko przy użyciu identyfikatora, który domyślnie do korzystania tag = null.

Więc, albo nie zawiera tekst jako tagu:

_completeNotificationManager.notify(id, notification); 

Lub, jeśli potrzebne oddzielne powiadomienia i nie chce im się sprać siebie, śledzić aktywnych tagów:

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

... 

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

Żałuję, że to, co próbujesz zrobić, nie zostało poparte, ponieważ wygląda na to, że tak powinno być.

+0

("nie można anulować wszystkich powiadomień o określonym ID") Uwaga ... można, ponieważ trzeba przypisać "tag unic do wszystkich notif" z identyfikatorem unic do każdego powiadomienia. – delive

0

Ostatnio miałem do czynienia z tym samym problemem. Udało mi się go rozwiązać.

Z tego co zrozumiałem.

1) użyj identyfikatora, który jest w zasadzie numerem losowym do powiadomienia i wyślij ten sam identyfikator do kodu (odbiorcy/aktywności ...), w którym chcesz go anulować.

2) Używanie tagów wydaje mi się nieskuteczne, ponieważ dodałem jeden tag do wszystkich powiadomień, ale z unikalnym identyfikatorem.Działało tylko na pierwszym tagu. więc całkowicie uniknąłem używania tagów. Jeśli chcesz korzystać z tagów, wystawiaj unikalne znaczniki wraz z unikalnym identyfikatorem i używaj ich jednocześnie podczas anulowania.

więc ostateczna odpowiedź ... co kiedyś i co działa dla mnie:

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

Teraz w działalności, która zostanie otwarty przez mojego działania kliknięciem anulować zgłoszenie:

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

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

Działa za każdym razem.

0

Moje powiadomienia nie zostały usunięte, ponieważ moja usługa to Usługa pierwszego planu, a NIE regularna usługa rozpoczęta przez StartService.

Jeśli twoja usługa jest nowa, zadzwoń pod numer stopForeground(true) zamiast stopself(). Teraz mój kod wygląda następująco:

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

i zadziałało, zgłoszenie zostało usunięte.