GeekyOmega GeekyOmega - 5 months ago 18
Android Question

How to update my notification to show my time counter changing?

I am almost finished with this toy app game I am making. It is giving me something to do while I have the flu. >_< So let me off on that technicality since I am asking a lot of questions lately.

Problem:
My notification is always showing my counter to be 30000. Why isn't it timing down?

What I have done:
I have implemented a simple Service class and a custom timer to tick down. Eventually once I am sure the timer is working I will exit the entire game.

Here is my code that I wrote:

package com.example.redshirtmarblez;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.widget.Toast;

public class TimingService extends Service{

public long counter = 30000;
private Context ctx;
private Activity localActivity;


private NotificationManager nm;

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate()
{
super.onCreate();
nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
declareNotification();
timer.start();
//Toast.makeText(this, "Timer is :" + counter, Toast.LENGTH_LONG).show();
//showNotification();
}


public void getActivity(Activity activity)
{
localActivity = activity;
}

//count to end the game
public CountDownTimer timer = new CountDownTimer(30000, 1000){

public void onTick(long millisUntilFinished){
counter = millisUntilFinished / 1000;
}

public void onFinish(){
counter = 0;


//Kill the game
int i = android.os.Process.myPid();
android.os.Process.killProcess(i);

}

};

/*
* Show a notification while this service is running
*/
public void declareNotification()
{
//Declare a new notification
Notification notification = new Notification(R.drawable.ic_launcher, "A New Notification", System.currentTimeMillis());

notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

Intent intent = new Intent(this, TimingService.class);
PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
notification.setLatestEventInfo(this, "herp", "counter: " + counter, activity);


//This is clearly not 1337, but a good joke
startForeground(1337, notification);

}

}


All this does when it runs is shows "A New Notification", and then changes to "herp counter: 30000". However, this notification never changes. It just stays 30000. Why? I thought I fixed this with making the flag ongoing?

Respectfully,
GeekyOmega

Answer

counter is not a reference; the notification will not update with its new value until you explicitly tell it to.

Have a look at the documentation on updating an existing notification. Your ID is 1337 here, so you can use that to update it.

In fact, you may just be able to call declareNotification() again from your onTick() method... If this doesn't work, however, I would suggest keeping a reference to the Notification object (as a member variable), then updating it, and use nm.notify(1337, /* your notification object */);.