您的位置:首页 > 移动开发 > Android开发

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

2016-03-28 14:30 633 查看
今天讲下如何定时执行后台任务。

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

主要使用到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: