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

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值