2011-11-27 15 views
8

Nella mia app, ho posto il mio servizio in primo piano per evitare che venga ucciso da utilizzare:L'aggiornamento di una notifica rimuove lo stato in primo piano di un servizio?

startForeground(NOTIFY_ID, notification); 

Questo visualizza anche la notifica per l'utente (che è grande). Il problema è che più tardi ho bisogno di aggiornare la notifica. Quindi uso il codice:

notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent); 
mNotificationManager.notify(NOTIFY_ID, notification); 

La domanda è quindi: lo faranno battere il Servizio dal suo stato speciale in primo piano?

In this answer, CommonsWare indica che questo comportamento è possibile, ma non è sicuro. Quindi qualcuno conosce la risposta vera?


Nota: Sono consapevole che un modo semplice per uscire da questo problema è chiamare ripetutamente startForeground() ogni volta che voglio aggiornare la notifica. Sto cercando di sapere se questa alternativa funzionerà anche.

+1

BTW, anche se è possibile aggiornare il testo di una notifica attuale, non è possibile rendere il testo ticker appare nella barra di stato più di una volta per un dato di notifica, anche se si cambia questo - almeno non usando Notification.FLAG_ONGOING_EVENT. Per mostrare un nuovo testo ticker per una notifica esistente, è necessario annullare la notifica e quindi riavviarla. –

risposta

9

L'app RandomMusicPlayer sul sito degli sviluppatori Android utilizza NotificationManager per aggiornare la notifica di un servizio in primo piano, quindi è molto probabile che mantenga lo stato in primo piano.

(Vedi setUpAsForeground() e updateNotification() nella classe MusicService.java.)

Da quello che ho capito, se si annulla la notifica il servizio cesserà di essere un servizio di primo piano, in modo da tenere a mente; se annulli la notifica, dovrai chiamare di nuovo startForeground() per ripristinare lo stato in primo piano del servizio.

8

Per chiarire quanto è stato detto qui:

Da quello che ho capito, se si annulla la notifica del servizio cesserà di essere un servizio di primo piano, in modo da tenere a mente; se si annulla la notifica , sarà necessario chiamare startForeground() nuovamente per ripristinare lo stato in primo piano del servizio.

Questa parte della risposta suggeriscono che è possibile rimuovere un continuo Notification impostato da un Service utilizzando NotificationManager.cancel() sulla persistente Notification. Questo non è vero. È impossibile rimuovere una notifica in corso impostata con startForeground() utilizzando NotificationManager.cancel().

L'unico modo per rimuoverlo è chiamare stopForeground(true), in modo che la notifica in corso venga rimossa, il che rende anche il Service smettere di essere in primo piano. Quindi in realtà è il contrario; lo Service non smette di essere in primo piano perché lo Notification viene annullato, lo Notification può essere annullato solo arrestando Service in primo piano.

Naturalmente si potrebbe chiamare startForeground() subito dopo, per ripristinare lo stato con un nuovo Notification. Un motivo per cui dovresti farlo se un testo ticker deve essere mostrato di nuovo, perché verrà eseguito solo la prima volta che viene visualizzato il Notification.

Questo comportamento non è documentato e ho sprecato 4 ore cercando di capire perché non è stato possibile rimuovere lo Notification. Ulteriori informazioni sul problema: NotificationManager.cancel() doesn't work for me

2

Quando si desidera aggiornare un set di notifiche da startForeground(), è sufficiente creare una nuova notificazione e quindi utilizzare NotificationManager per notificarlo.

Il punto chiave è utilizzare lo stesso ID di notifica.

L'aggiornamento della notifica NON rimuoverà il servizio dallo stato in primo piano (ciò può essere fatto solo chiamando stopForground);

Esempio:

private static final int notif_id=1; 

@Override 
public void onCreate(){ 
    this.startForeground(); 
} 

private void startForeground() { 
     startForeground(notif_id, getMyActivityNotification("")); 
} 

private Notification getMyActivityNotification(String text){ 
     // The PendingIntent to launch our activity if the user selects 
     // this notification 
     CharSequence title = getText(R.string.title_activity); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 
       0, new Intent(this, MyActivity.class), 0); 

     return new Notification.Builder(this) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setSmallIcon(R.drawable.ic_launcher_b3) 
       .setContentIntent(contentIntent).getNotification();  
} 
/** 
this is the method that can be called to update the Notification 
*/ 
private void updateNotification() { 

       String text = "Some text that will update the notification"; 

       Notification notification = getMyActivityNotification(text); 

       NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(notif_id, notification); 
} 
Problemi correlati