Android学习之定时执行后台任务

今天讲下如何定时执行后台任务。

当然还是那句话,方法有好几种,这里就讲下我认为最好用的。

主要使用到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

你可能感兴趣的:(android,timer,timertask,service,定时)