今天讲下如何定时执行后台任务。
当然还是那句话,方法有好几种,这里就讲下我认为最好用的。
主要使用到TimerTask和Service,相信大家都接触过,大家可以看下TimerTask的源码:
public abstract class TimerTask implements Runnable {
Runnale用来实现多线程,所以...
好了,言归正传,讲下怎么定时获取:
需要一个接口,为什么需要接口?因为数据的获取与部署会放在Service之外而不是Service之中,Service要做的就是定时去执行任务。所以我们需要一个接口来回调方法。
/** * 定时Service接口 * * @author yuzhentao */ public interface OnTimerServiceListener {
/** * 获取数据 */ void getData(); }
接下来就是Service了:
/** * 定时器Service * * @author yuzhentao */ public class TimerService extends Service {
private Timer timer; private TimerTask task; private final TimerBinder timerBinder = new TimerBinder(); private OnTimerServiceListener onTimerServiceListener; @Nullable @Override public IBinder onBind(Intent intent) {
return timerBinder; }
@Override public void onCreate() {
super.onCreate(); startTimer(); }
@Override public void onDestroy() {
super.onDestroy(); stopTimer(); }
/** * 启动定时器 */ public void startTimer() {
if (timer == null) {
timer = new Timer(); task = new TimerTask() {
@Override public void run() {
onTimerServiceListener.getData(); }
}; timer.schedule(task, 1000, 1000 * 10); }
}
/** * 停止定时器 */ public void stopTimer() {
if (timer != null) {
task.cancel(); timer.cancel(); task = null; timer = null; }
}
/** * TimerBinder */ public class TimerBinder extends Binder {
public TimerService getService() {
return TimerService.this; }
}
/** * 设置OnTimerServiceListener接口 * * @param onTimerServiceListener:OnTimerServiceListener */ public void setOnTimerServiceListener(OnTimerServiceListener onTimerServiceListener) {
this.onTimerServiceListener = onTimerServiceListener; }
}
接口怎么使用大家可以看我另一篇文章,接下来的步骤是:
1.Service中写一个类继承一个Binder,其中可以返回Service本身
2.Service中实例这个Binder
3.在onBind()中返回这个Binder
/** * 主界面 * * @author yuzhentao */ public class MainActivity extends Activity {
private TimerService timerService; private ServiceConnection serviceConnection = new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
timerService = ((TimerService.TimerBinder) service).getService(); timerService.setOnTimerServiceListener(onTimerServiceListener); }
@Override public void onServiceDisconnected(ComponentName name) {
}
}; private OnTimerServiceListener onTimerServiceListener = new OnTimerServiceListener() {
@Override public void getData() {
Log.e("yuzhentao", "定时执行任务"); }
}; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(new Intent(this, TimerService.class), serviceConnection, Context.BIND_AUTO_CREATE); }
@Override public void onDestroy() {
super.onDestroy(); unbindService(serviceConnection); timerService = null; }
}
4.Activity中实现SeriviceConnection接口
5.在onServiceConnected()中通过IBinder得到Service实例,这个IBinder就是onBind()返回的Binder
6.通过Service实例调用接口
7.Activity中实现Service中要回调的接口,并实现方法,这里可以做一些网络的操作,更新UI等
8.Activity中bindService()和unbindService()绑定和解绑服务
9.最后Service中通过TimerTask的run()方法定时执行回调接口的方法,达到定时执行后台任务的目的
10.项目清单中注册Service和设置网络权限
没有效果图。这里是10秒执行一次,一般实际情况肯定是远远大于这个时间的,10秒执行一次的服务实在是有点可怕。
03-28 14:51:11.457 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:51:21.458 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:51:31.457 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:51:41.458 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:51:51.458 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:01.458 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:11.458 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:21.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:31.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:41.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:52:51.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:01.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:11.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:21.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:31.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:41.459 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:53:51.460 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:01.460 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:11.460 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:21.460 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:31.460 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:41.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:54:51.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:01.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:11.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:21.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:31.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:41.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:55:51.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:01.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:11.461 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:21.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:31.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:41.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:56:51.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:57:01.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:57:11.462 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
03-28 14:57:21.463 31109-31150/yuzhentao.timertaskdemo E/yuzhentao: 定时执行任务
希望对各位有所帮助。
Demo地址:http://download.csdn.net/detail/qq_23940659/9474606