'How to detect change in time each second in Android?

I am creating a custom watch face for android by following this tutorial. I have implemented broadcast receiver to detect change in time as follows:

Inside my activity I have static block to filter following intents:

static {
    intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
    intentFilter.addAction(Intent.ACTION_TIME_TICK);
    intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
 }

My receiver class:

public class MyReciever extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        c = Calendar.getInstance();
        Log.d("myapp", "time changed");
        hrs = c.get(Calendar.HOUR_OF_DAY);
        min = c.get(Calendar.MINUTE);
        sec = c.get(Calendar.SECOND);

        txt_hrs.setText(String.valueOf(hrs));
        txt_mins.setText(String.valueOf(min));
        txt_sec.setText(String.valueOf(sec));
    }
}

And I have registered receiver inside oncreate():

 MyReciever myReciever = new MyReciever();
registerReceiver(myReciever,intentFilter);

Above code works fine for hours and minutes, but doesn't work for seconds.

the problem with Intent.ACTION_TIME_TICK is that it is broadcasted each minute, not second.

I need to detect change in time each second for the clock on watchface. Anyone have any solution for 'detecting time change per second'?



Solution 1:[1]

You may look why you are not getting intent after every seconds. So better is to create a separate thread or use asynctask where you need to update your textview on each one seconds.


Or you can use Timer and TimerTask for such purpose, like below

public void updateTimeOnEachSecond() {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

        @Override
        public void run() {
            c = Calendar.getInstance();
            Log.d("myapp", "time changed");
            hrs = c.get(Calendar.HOUR_OF_DAY);
            min = c.get(Calendar.MINUTE);
            sec = c.get(Calendar.SECOND);

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    txt_hrs.setText(String.valueOf(hrs));
                    txt_mins.setText(String.valueOf(min));
                    txt_sec.setText(String.valueOf(sec));
                }
            });

        }
    }, 0, 1000);

}

And call this method after initialising each view from activity.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tobias Gassmann