2013-02-14 20 views
25

PreludeAggiornamento testo della notifica, non tutta la notifica

Sto cercando di aggiungere un cronometro sulla notifica. Il cronometro è un servizio. Ogni secondo questa linea si chiama (continua thread è un il booleano "correre", TimeString è la stringa elaborata che mostra il tempo):

NotificationChrono.updateNotification(getApplicationContext(), continueThread, 
NOTIF_ID, timeString, "Chronometer", notificationManager); 

Questa è la classe NotificationChrono:

public class NotificationChrono { 

    static public void updateNotification(Context context, boolean running, 
     int id, String title, String text, 
     NotificationManager notificationManager) { 

     Intent stopIntent = new Intent("com.corsalini.david.barcalc.STOP"); 
     PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context, 
      0, stopIntent, 0); 

    Intent startIntent = new Intent(
      "com.corsalini.david.barcalc.STARTPAUSE"); 
    PendingIntent startPendingIntent = PendingIntent.getBroadcast(context, 
      0, startIntent, 0); 

    NotificationCompat.Builder builder = new NotificationCompat.Builder(
      context) 

      .setContentText(context.getString(R.string.notif_text)) 

      .setContentTitle(title) 

      .setSmallIcon(R.drawable.ic_action_alarm_2) 

      .setAutoCancel(false) 

      .setOngoing(running) 

      .setOnlyAlertOnce(true) 

      .setContentIntent(
        PendingIntent.getActivity(context, 10, new Intent(
          context, FrontActivity.class) 
          .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0)) 
      .addAction(
        running ? R.drawable.ic_action_pause 
          : R.drawable.ic_action_play, 
        running ? context.getString(R.string.pause) : context 
          .getString(R.string.start), startPendingIntent) 
      .addAction(R.drawable.ic_action_stop, 
        context.getString(R.string.stop), stopPendingIntent); 

    notificationManager.notify(id, builder.build()); 
} 
} 

Problema

Ogni secondo la notifica viene cancellata e ricreata, visivamente significa che ogni secondo la notifica scompare e riappare nell'elenco di notifica.

Quello che vorrei è solo aggiornare il testo TITOLO, non ricreare la notifica interamente ogni secondo. È possibile?

+0

Se la mia risposta ha fatto il trucco per te, per favore accetta come risposta :) – PieterAelse

+0

Non ho usato la tua risposta, in realtà non ricordo esattamente quello che ho fatto (penso che il trucco fosse con setWhen). Ma leggendo la tua risposta, sembra una soluzione migliore, lo accetterò! –

risposta

70

Assicurarsi di utilizzare lo stesso builder NotificationCompat.Builder ogni volta per creare lo Notification!

Anche se per la prima volta è necessario impostare tutto, la seconda volta utilizzando Builder è sufficiente impostare i valori che si desidera aggiornare. Dopo di che chiama lo notificationManager.notify(id, builder.build()) proprio come hai fatto tu. Se si utilizza lo stesso ID, la notifica viene aggiornata (importante!).

Esempio:

//First time 
NotificationCompat.Builder builder = new NotificationCompat.Builder(context) 
      .setContentText(context.getString(R.string.notif_text)) 
      .setContentTitle(title) 
      .setSmallIcon(R.drawable.ic_action_alarm_2) 
      .setAutoCancel(false) 
      .setOngoing(running) 
      .setOnlyAlertOnce(true) 
      .setContentIntent(
        PendingIntent.getActivity(context, 10, 
          new Intent(context, FrontActivity.class)         
          .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 
        0) 
      ) 
      .addAction(running ? R.drawable.ic_action_pause 
           : R.drawable.ic_action_play, 
         running ? context.getString(R.string.pause) 
           : context.getString(R.string.start), 
         startPendingIntent) 
      .addAction(R.drawable.ic_action_stop, context.getString(R.string.stop), 
        stopPendingIntent); 

notificationManager.notify(id, builder.build()); 

//Second time 
builder.setContentTitle(title); 
notificationManager.notify(id, builder.build()); 

Ma è anche possibile utilizzare il metodo della classe NotificationCompatsetUsesChronometer. Questo visualizza automaticamente un cronometro utilizzando il timestamp specificato (in grado di impostare con setWhen).

+0

esempio utile, grazie – KGCybeX

3

Grazie per l'idea PieterAelse!

Nel mio caso ho dovuto andare con questo (costruzione di una nuova notifica) per il secondo e seguenti orari:

 builder.setContentText(getConvertedTime(millisUntilFinished)); 
     Notification notification = builder.getNotification(); 
     notification.flags = Notification.FLAG_ONGOING_EVENT;    
     nm.notify(R.string.app_name,notification); 

Speranza che aiuta.

+0

grazie per aver menzionato il flag ONGOING_EVENT, stavo cercando anche questo – KGCybeX

+0

questo potrebbe essere utile anche ad alcuni (Priorità di notifica) - https://stackoverflow.com/a/35106689/4628115 – KGCybeX

Problemi correlati