2010-09-02 11 views
36

Ho creato un'app che imposta le notifiche nella barra di stato a discesa dei telefoni Android. Tuttavia, c'è un bug nel mio codice (a volte le notifiche sono impostate, a volte non lo sono). Voglio essere in grado di controllare (nel codice) SE LA NOTIFICA È VISIBILE ALL'UTENTE. (cioè l'utente può vedere la notifica nella barra di stato?).Come verificare quali notifiche sono attive nella barra di stato in Android Dev?

Come posso fare questo? (Grazie in anticipo).

codice di esempio è molto apprezzato.

risposta

36

Desidero poter VERIFICARE (nel codice) SE LA NOTIFICA È VISIBILE PER L'UTENTE. (cioè l'utente può vedere la notifica nella barra di stato?).

Come posso fare questo?

Non puoi, mi dispiace. Aggiornamento: Ora possibile con Android 4.3 e versioni successive http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications()

Tuttavia, è sempre possibile semplicemente cancel() essa - l'annullamento di un Notification che non è sullo schermo è perfettamente bene. Al contrario, è sempre possibile chiamare in modo sicuro notify() per lo stesso Notification, e anche questo non causerà problemi se lo Notification è già sullo schermo.

EDIT:

NotificationManager.getActiveNotifications() è stato aggiunto nel API 23 se non si desidera utilizzare il NotificationListenerService

+0

scriverà nuovamente il testo Init per la notifica se si chiama nuovamente notificare – weakwire

+0

@weakwire: solo se la notifica non era già visualizzata sullo schermo. – CommonsWare

+0

non lo sapeva. Non risponde alla domanda ma serve allo scopo con 2 linee di codice. +1 – weakwire

24

è necessario impostare un ID per ogni notifica effettuata.

in modo da fare una notifica ..

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notId + selectedPosition, intent, 0); 

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis() - offset, pendingIntent); 

Notification notification = new Notification(R.drawable.icon, "TVGuide Υπενθύμιση", System.currentTimeMillis()); 
NotificationManager manger = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); 
notification.setLatestEventInfo(context, "Κανάλι: " + b.getString("channel"), "Εκπομπή: " + showname, pendingIntent); 
manger.notify(notId, notification); 

per cancellarlo ..

PendingIntent pendingIntent = PendingIntent.getBroadcast(context,notId, intent, 0); 
pendingIntent.cancel(); 

e di verificare se attivo .. (existAlarm restituisce null se nessun intento attesa disponibili)

public PendingIntent existAlarm(int id) { 
    Intent intent = new Intent(this, alarmreceiver.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    PendingIntent test = PendingIntent.getBroadcast(this, id + selectedPosition, intent, PendingIntent.FLAG_NO_CREATE); 
    return test; 
} 

Quindi tutto viene giù per inizializzare un ID per ogni notifica e come lo si rende unico.

+9

@CommonsWare: se i chiamare una notifica con un intento in sospeso posso controllare se esiste l'intenzione in sospeso quindi la notifica esiste anche – weakwire

+0

Ah, vedo dove stai andando.Tecnica interessante - Non ho provato questo o l'ho visto altrove per questo scopo. – CommonsWare

+1

Molto tempo ... ma ancora .. Funziona sulle versioni post GB? E come posso usare questo snippet se sto creando notifiche usando TaskStackBuilder? –

2

Esiste una bandiera per questo.

Notification notification = new Notification(icon, tickerText, when); 
notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE; 

FLAG_ONLY_ALERT_ONCE:

... deve essere impostato se si desidera che il suono e/o vibrazioni giocano ogni volta che la notifica viene inviata, anche se non è stato annullato prima.

Anche se, la notifica sarà lampeggiare quando viene inviato di nuovo, ma non ci sarà alcun suono o vibrazione.

25

solo per mettere tutti insieme. Questo è come funziona

Per costruire una notifica,

 Notification n = new Notification.Builder(MyService.this) 
       .setContentTitle("Notification Title") 
       .setContentText("Notification Message") 
       .setSmallIcon(R.drawable.myicon).build(); 

per fare un suono di notifica chiamata setSound() di notifica,

 Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     Notification n = new Notification.Builder(MyService.this) 
       .setContentTitle("Notification Title") 
       .setContentText("Notification Message") 
       .setSound(alarmSound) 
       .setSmallIcon(R.drawable.myicon).build(); 

Per annullare la notifica dopo che l'utente selezionato e lanciato l'Intento ricevente , chiama setAutoCancel(),

 Notification n = new Notification.Builder(MyService.this) 
       .setContentTitle("Notification Title") 
       .setContentText("Notification Message") 
       .setSound(alarmSound) 
       .setAutoCancel(true) 
       .setSmallIcon(R.drawable.myicon).build(); 

Per emettere un suono/vibrare una sola volta per una notifica specifica utilizzare Notification.FLAG_ONLY_ALERT_ONCE. Con questo flag, la tua notifica verrà emessa solo una volta finché non verrà annullata e potrai chiamare notify() tutte le volte che vuoi con l'id di notifica. Notare che se si chiama cancel() o se l'utente annulla la notifica o è annullato automaticamente, la chiamata notify() farà nuovamente risuonare la notifica.

 n.flags |= Notification.FLAG_ONLY_ALERT_ONCE; // Dont vibrate or make notification sound 

Infine per mettere la notifica sul pannello di notifica,

 NotificationManager notificationManager = 
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

     notificationManager.notify(notification_id, n); 

Nota che notification_id qui è importante se si desidera utilizzare la notifica in modo efficace. (Per mantenere singolo suono/vibrazioni per una notifica o al annullare una notifica specifica).

Per annullare un particolare di notifica,

 NotificationManager notificationManager = 
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     notificationManager.cancel(notification_id); 

È possibile cancel() una notifica, anche se non esiste o è possibile chiamare notify() tutte le volte che si desidera con lo stesso ID. Si noti che la chiamata di notifica con ID diverso creerà nuove notifiche.

Quindi, indipendentemente dal fatto che la notifica esiste o non, se si chiama notify() di nuovo con il corretto notification_id con il set Notification.FLAG_ONLY_ALERT_ONCE bandiera, è possibile mantenere la notifica in vita senza disturbare l'utente con i suoni ripetuti.

+0

'.setOnlyAlertOnce (true)' per NotificationCompat – behelit

6

Un nuovo metodo è stato introdotto alla classe NotificationManager in API 23:

public StatusBarNotification[] getActiveNotifications() 
+52

Non vedo l'ora di utilizzarlo nel 2019. – ZaBlanc

+0

Non è disponibile dall'API 18? Http: //developer.android.com/reference/android/service/notification/NotificationListenerService. html # getActiveNotifications() – acrespo

+0

Ho scritto su android.app.NotificationManager :: getActiveNotifications e not NotificationListenerService. –

1

Si seems che da Android M (API 23) è possibile ottenere il vostro processo del genere, senza usare né NotificationListenerService richiede autorizzazioni aggiuntive:

notificationManager.getActiveNotifications()

Problemi correlati