2013-02-14 10 views
25

PreludeText aktualisiert mitteilungs, nicht ganz Meldung

Ich versuche, einen Chronometer über die Mitteilung hinzuzufügen. Der Chronometer ist ein Service. Jeder zweite dieser Zeile genannt wird (weiter Thema ist eine der "running" boolean, ist Time die erarbeitete String, die die Zeit):

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

Dies ist die NotificationChrono Klasse:

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

Problem

Jede Sekunde wird die Benachrichtigung gelöscht und neu erstellt, visuell bedeutet dies, dass jede Sekunde die Benachrichtigung verschwindet und wieder in der Benachrichtigungsliste erscheint.

Was ich möchte, ist nur den TITLE-Text zu aktualisieren, nicht die Benachrichtigung vollständig jede Sekunde neu erstellen. Ist es möglich?

+0

Wenn meine Antwort den Trick für dich gemacht hat, akzeptiere bitte als Antwort :) – PieterAelse

+0

Ich habe deine Antwort nicht verwendet, ich erinnere mich nicht genau, was ich getan habe (ich glaube, der Trick war mit setWhen). Aber wenn ich deine Antwort lese, scheint es eine bessere Lösung zu sein, das werde ich akzeptieren! –

Antwort

70

Achten Sie darauf, immer denselben NotificationCompat.Builder Builder für die Erstellung der Notification zu verwenden!

Obwohl Sie zum ersten Mal alles einstellen müssen, das zweite Mal mit der Builder Sie müssen nur die Werte, die Sie aktualisieren möchten. Danach ruft es notificationManager.notify(id, builder.build()) an, genau wie du es getan hast. Wenn Sie das gleiche ID verwenden, wird die Benachrichtigung aktualisiert (wichtig!).

Beispiel:

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

Sie können aber auch die setUsesChronometer Methode der NotificationCompat Klasse. Dadurch wird automatisch ein Chronometer mit dem angegebenen Zeitstempel angezeigt (einstellbar mit setWhen).

+0

nützliches Beispiel, danke – KGCybeX

3

Danke für die Idee PieterAelse!

In meinem Fall hatte ich mit diesem (bauen eine neue Benachrichtigung) für die zweiten und folgenden Zeiten zu gehen:

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

Hoffe, es hilft.

+0

danke für die Erwähnung der ONGOING_EVENT Flagge, war auch auf der Suche nach diesem – KGCybeX

+0

dies kann auch nützlich sein (Benachrichtigung Priorität) - https://Stackoverflow.com/a/35106689/4628115 – KGCybeX

Verwandte Themen