原文:Android实现一个定时器,类似闹钟功能,并且监听时间的变化数字显示
实现一个定时器需要了解Android的Service和BroadcastReceiver。
Service是为了让定时器在后台可以运行,BroadcastReceiver是为了监听定时器发送时间变化的广播。话不多说,看代码吧。
TimingService (定时服务)
public class TimingService extends Service {
private TimingReceiver mReceiver;
private Timer mTimingReceiver ;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
mTimingReceiver = new TimingReceiver();
mTimer = new Timer();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
IntentFilter filter = new IntentFilter();
filter.addAction("com.XX.timing");//添加定时
registerReceiver(mTimingReceiver, filter);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mTimingReceiver);
}
private class TimingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final long duration = intent.getLongExtra("duration", 0); //定时时间
final long timeCurrent = System.currentTimeMillis(); //接收到广播的时间
mTimer.cancel();
if (duration > 0) {
mTimer = new Timer();
//定时器
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Intent intent = new Intent();
intent.setAction("com.XX.timing.finish");//自己定义的action 结束定时
sendBroadcast(intent);
}
}, duration);
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.e("TimingService", getStandardTime(
duration-System.currentTimeMillis()+timeCurrent);
//可以在log中看到时间的变化
}
}, 0 , 60*1000);
}
}
}
public String getStandardTime(long timestamp) {
SimpleDateFormat sdf;
if (timestamp > 60*60*1000) {
sdf = new SimpleDateFormat("HH:mm:ss",
Locale.getDefault());
} else {
sdf = new SimpleDateFormat("mm:ss",
Locale.getDefault());
}
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
Log.e("timestamp",timestamp + "");
Date date = new Date(timestamp+1000);
sdf.format(date);
return sdf.format(date);
}
}
开启服务
Intent intent = new Intent(MainActivity.this, TimingService.class);
startService(intent);
在其他页面接收广播
//监听开始广播
IntentFilter timeFilter = new IntentFilter();
timeFilter.addAction("com.xx.timing");
registerReceiver(receiver, timeFilter);
//监听结束广播
IntentFilter timeFilter = new IntentFilter();
timeFilter.addAction("com.xx.timing。finish");
registerReceiver(receiver, timeFilter);
private class TimingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//这里可以通过判断action的不同来判断是开始还是结束
}
}