2013-04-23 10 views
18

Przyjrzałem się wszystkim innym, niedziałającym, pytaniom, które nie działają w AUTO-CANCEL, i wszystkie one wydają się zawierać błędy, których nie robię. Próbowałem zarównoAndroid: Używanie AUTO-CANCEL w powiadomieniu, gdy aplikacja działa w tle.

builder.setAutoCancel(true); 

i

Notification notif = builder.build(); 
notif.flags |= Notification.FLAG_AUTO_CANCEL; 

Ani dzieła.

Używam NotificationCompat, ponieważ mój minimalny API to 8. Oto mój pełny kod. W tym konkretnym powiadomieniu nie wzywam intencji, ponieważ nie potrzebuję niczego użytkownika.

NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentTitle(getString(R.string.app_name) + ": my title"); 
builder.setContentText(message); 
builder.setSmallIcon(R.drawable.notification_icon); 

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.prog_icon); 
builder.setLargeIcon(bitmap); 

builder.setAutoCancel(true); // dismiss notification on user click 

NotificationManager notiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
notiManager.notify(MY_NOTI_MANAGER_ID, builder.build()); 

Powiadomienie wyświetla się idealnie. Możesz przesuwać palcem, aby go wyczyścić. Ale po prostu dotykając go nie odrzuca powiadomienia. Po prostu się zapala i zostaje.

Kilka możliwych różnic między moim kodem i innymi opublikowanymi tutaj: 1) Używam NotificationCompat (co nie powinno mieć znaczenia, ale słyszeliśmy, że wcześniej). 2) Ponieważ moje powiadomienie jest proste, nie załączam intencji.

Proszę dać mi znać, jeśli masz jakiekolwiek spostrzeżenia.

Edytuj: Moim celem jest odrzucenie powiadomienia bez uprzedniej prezentacji mojej aplikacji w tle.

Odpowiedz

24

Więc widocznie robisz trzeba oczekującego intencji.

Na Android - notification manager, having a notification without an intent znalazłem rozwiązanie, które pobiera bieżącą aktywną aplikację jako oczekujące zamierzenie (aby nie trzeba było uruchamiać własnej aktywności w celu odrzucenia powiadomienia).

Właśnie dodałem następujące dwa wiersze kodu (tuż po ustawieniu auto-cancel):

PendingIntent notifyPIntent = 
    PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0);  
builder.setContentIntent(notifyPIntent); 

Działało świetnie. Powiedziałbym, że jeśli nie chcesz, aby twoja działalność została uruchomiona ponownie w wyniku kliknięcia twojego powiadomienia przez użytkownika, jest to najlepsza opcja.

+0

To prawda ... – superUser

+2

Rozwiązanie jest dobre, jednak uważam, że wyjaśnienie jest niedokładne. Nie "chwyta bieżącej aktywnej aplikacji jako oczekującej intencji", bardziej prawdopodobne, że wysyła puste intencje i zwija zasobnik powiadomień. Ponieważ zamiar po prostu nic nie robi, zdarza się, że powracamy na szczyt stosu działań. –

+0

Tak działa jak mistrz .. Wielkie dzięki .. –

6

Wygląda na to, że brakuje połączenia PendingIntent i setContentIntent(). Uważam, że jest to wymagane, aby funkcja automatycznego anulowania działała.

Oto Notification -displaying logiki z this sample project że działa:

private void raiseNotification(Intent inbound, File output, Exception e) { 
    NotificationCompat.Builder b=new NotificationCompat.Builder(this); 

    b.setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL) 
    .setWhen(System.currentTimeMillis()); 

    if (e == null) { 
     b.setContentTitle(getString(R.string.download_complete)) 
     .setContentText(getString(R.string.fun)) 
     .setSmallIcon(android.R.drawable.stat_sys_download_done) 
     .setTicker(getString(R.string.download_complete)); 

     Intent outbound=new Intent(Intent.ACTION_VIEW); 

     outbound.setDataAndType(Uri.fromFile(output), inbound.getType()); 

     b.setContentIntent(PendingIntent.getActivity(this, 0, outbound, 0)); 
    } 
    else { 
     b.setContentTitle(getString(R.string.exception)) 
     .setContentText(e.getMessage()) 
     .setSmallIcon(android.R.drawable.stat_notify_error) 
     .setTicker(getString(R.string.exception)); 
    } 

    NotificationManager mgr= 
     (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

    mgr.notify(NOTIFY_ID, b.build()); 
    } 
+1

Dziękuję. Właśnie znalazłem to rozwiązanie również: OczekiwanieIntent notifyPendingIntent = OczekiwanieIntent.getActivity (getApplicationContext(), 0, new Intent(), 0); \t \t builder.setContentIntent (notifyPendingIntent); To rozwiązanie zostało opublikowane tutaj: http: // stackoverflow.com/questions/7040742/android-notification-manager-having-a-notification-without-anent – BeccaP

4

Hai, drogi przyjacielu, jeśli chcesz pokazać nieodwoływalne powiadomienie (nie można anulować dla użytkowników) dla określonego czasu , a potem trzeba go wyczyścić (jak odtwarzacz muzyki), możesz go użyć.

mNotificationBuilder .setSmallIcon(android.R.drawable.btn_plus); 
mNotificationBuilder .setContentTitle("My notification"); 
mNotificationBuilder .setContentText("Notificattion From service"); 
mNotificationBuilder .setLights(0xFF0000FF, 500, 500); 

Notification note = mNotificationBuilder.build(); 
note.flags = Notification.FLAG_ONGOING_EVENT; // For Non cancellable notification 
mNotificationManager.notify(NOTIFICATION_ID, note); 
Powiązane problemy