Service学习——在服务中执行重复任务
除了在服务中执行长时间运行的任务,一些重复任务也会在服务中执行。比如,一个一直在后台运行的闹钟服务。这时服务可能要定期执行一些代码来检查是否到了一个预设的时间以便发出提醒。要运行一个按固定的时间间隔执行的代码块,可以在服务中使用Timer类。
我的Repeatedly类:
packagecom.example.myservice;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.util.Log;
public classRepeatedly {
privatestatic int counter = 0;
privatestatic Timer timer = new Timer();
staticfinal int UPDATE_INTERVAL = 1000;
publicRepeatedly() {
//TODO Auto-generated constructor stub
}
publicstatic void doSomethingRepeatedly(){
//调用scheduleAtFixeRate方法开始执行任务,还有其他方法,可以查看 api文档
timer.scheduleAtFixedRate(newTimerTask() {
@Override
publicvoid run() {
//TODO Auto-generated method stub
Log.d("MyService",String.valueOf(++counter));
}
},0, UPDATE_INTERVAL);
}
//这里在停止服务时可以调用,以停止这个线程正在执行的代码
publicstatic void stopTimer(){
if(timer!=null){
timer.cancel();
}
}
}
MyService类中需要改变的代码段:
public intonStartCommand(Intent intent, int flags,int startId) {
//TODO Auto-generated method stub
//我们希望这个服务在被显示停止前一直运行,所以返回“粘性的”状态
Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();
Repeatedly.doSomethingRepeatedly();
return START_STICKY;
}
public void onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
Repeatedly.stopTimer();
Toast.makeText(this,"Service Stopped", Toast.LENGTH_LONG).show();
}