2013-04-23 7 views
18

Ho visto tutte le altre domande AUTO-CANCEL-non-lavoro qui, e sembrano tutte coinvolgere errori che non sto facendo. Ho provato entrambe leAndroid: utilizzo di AUTO-CANCEL su una notifica quando l'app è in esecuzione in background

builder.setAutoCancel(true); 

e

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

Né opere.

Sto utilizzando NotificationCompat poiché la mia API minima è 8. Ecco il mio codice completo. In questa particolare notifica, non sto chiamando un intento, dal momento che non ho bisogno che l'utente faccia qualcosa.

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

La notifica viene visualizzata perfettamente. Puoi scorrere per cancellarlo. Ma semplicemente toccandolo non si elimina la notifica. Si illumina e resta lì.

Alcune possibili differenze tra il mio codice e altri 'postati qui: 1) Sto usando NotificationCompat (che non dovrebbe fare la differenza, ma l'abbiamo già sentito prima). 2) Poiché la mia notifica è semplice, non allego un intento.

Per favore fatemi sapere se avete qualche intuizione.

Modifica: il mio scopo è eliminare una notifica senza mettere in primo piano la mia app in background.

risposta

24

Quindi a quanto pare si fare bisogno di un intento in sospeso.

A Android - notification manager, having a notification without an intent, ho trovato una soluzione che considera l'applicazione attiva corrente come l'intento in sospeso (in modo che non sia necessario avviare la propria attività per ignorare la notifica).

Ho appena aggiunti i seguenti due righe di codice (a destra dopo aver impostato l'auto-annulla):

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

ha funzionato grande. Direi che se non vuoi che la tua attività si riavvii come conseguenza all'utente che fa clic sulla tua notifica, questa è la tua migliore opzione.

+0

Questo è giusto ... – superUser

+2

La soluzione è buona, tuttavia penso che la spiegazione sia inesatta. Non "afferra l'attuale applicazione attiva come intento in sospeso", più probabilmente invia l'intento vuoto e comprime la barra delle notifiche. Dal momento che l'intento non fa nulla, ci capita di ricadere in cima alla pila di attività. –

+0

si lavora come campione .. Grazie mille .. –

6

Sembra che manchi la chiamata PendingIntent e setContentIntent(). Credo che sia necessario che l'annullamento automatico funzioni.

Ecco alcune Notification Visualizzazione delle logiche da this sample project che funziona:

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

Grazie. Ho appena trovato questa soluzione anche: PendingIntent notifyPendingIntent = PendingIntent.getActivity (getApplicationContext(), 0, new Intent(), 0); \t \t builder.setContentIntent (notifyPendingIntent); Questa soluzione è stata pubblicata qui: http: // stackoverflow.it/questions/7040742/android-notification-manager-having-a-notification-without-an-intent – BeccaP

4

Hai un caro amico se vuoi mostrare la notifica non cancellabile (non cancellabile per gli utenti) per un particolare periodo e dopo averlo cancellato (come il lettore musicale) puoi usare questo.

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); 
Problemi correlati