Here a simple clock i developed using methods used in android native DigitalClock.java and AnalogClock.Java classes.this clock supports for events that triggered for each second or minute,so you can use those events and run your code.
- StartTickPerSecond() method uses the method used in DigitalClock.java to get the tick per second.
- StartTickPerMinute() method uses the method used in AnalogClock.java to get the tick per minute
this still may require some modifications..but hope this will be something you to start with..
Clock.java
package com.sample.data;
import java.util.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;
public class Clock
{
public static final int TICKPERSECOND=0;
public static final int TICKPERMINUTE=1;
private Time Time;
private TimeZone TimeZone;
private Handler Handler;
private List<OnClockTickListner> OnClockTickListenerList = new ArrayList<OnClockTickListner>();
private Runnable Ticker;
private BroadcastReceiver IntentReceiver;
private IntentFilter IntentFilter;
private int TickMethod=0;
Context Context;
public Clock(Context context)
{
this(context, Clock.TICKPERMINUTE);
}
public Clock(Context context,int tickMethod)
{
this.Context=context;
this.TickMethod=tickMethod;
this.Time=new Time();
this.Time.setToNow();
switch (TickMethod)
{
case 0:
this.StartTickPerSecond();
break;
case 1:
this.StartTickPerMinute();
break;
default:
break;
}
}
private void Tick(long tickInMillis)
{
Clock.this.Time.set(Clock.this.Time.toMillis(true)+tickInMillis);
this.NotifyOnTickListners();
}
private void NotifyOnTickListners()
{
switch (TickMethod)
{
case 0:
for(OnClockTickListner listner:OnClockTickListenerList)
{
listner.OnSecondTick(Time);
}
break;
case 1:
for(OnClockTickListner listner:OnClockTickListenerList)
{
listner.OnMinuteTick(Time);
}
break;
}
}
private void StartTickPerSecond()
{
this.Handler=new Handler();
this.Ticker = new Runnable()
{
public void run()
{
Tick(1000);
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
Handler.postAtTime(Ticker, next);
}
};
this.Ticker.run();
}
private void StartTickPerMinute()
{
this.IntentReceiver= new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Tick(60000);
}
};
this.IntentFilter = new IntentFilter();
this.IntentFilter.addAction(Intent.ACTION_TIME_TICK);
this.Context.registerReceiver(this.IntentReceiver, this.IntentFilter, null, this.Handler);
}
public void StopTick()
{
if(this.IntentReceiver!=null)
{
this.Context.unregisterReceiver(this.IntentReceiver);
}
if(this.Handler!=null)
{
this.Handler.removeCallbacks(this.Ticker);
}
}
public Time GetCurrentTime()
{
return this.Time;
}
public void AddClockTickListner(OnClockTickListner listner)
{
this.OnClockTickListenerList.add(listner);
}
}
OnClockTickListner.java
public interface OnClockTickListner {
public void OnSecondTick(Time currentTime);
public void OnMinuteTick(Time currentTime);
}
How to use
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.clock_list_item);
Clock c=new Clock(this);
c.AddClockTickListner(new OnClockTickListner() {
@Override
public void OnSecondTick(Time currentTime) {
Log.d("Tick Test per Second",DateFormat.format("h:mm:ss aa ", currentTime.toMillis(true)).toString());
}
@Override
public void OnMinuteTick(Time currentTime) {
Log.d("Tick Test per Minute",DateFormat.format("h:mm aa", currentTime.toMillis(true)).toString());
}
});
}
}