Android学习之定时执行后台任务
2016-03-28 14:30
633 查看
今天讲下如何定时执行后台任务。
当然还是那句话,方法有好几种,这里就讲下我认为最好用的。
主要使用到TimerTask和Service,相信大家都接触过,大家可以看下TimerTask的源码:
Runnale用来实现多线程,所以...
好了,言归正传,讲下怎么定时获取:
需要一个接口,为什么需要接口?因为数据的获取与部署会放在Service之外而不是Service之中,Service要做的就是定时去执行任务。所以我们需要一个接口来回调方法。
接下来就是Service了:
接口怎么使用大家可以看我另一篇文章,接下来的步骤是:
1.Service中写一个类继承一个Binder,其中可以返回Service本身
2.Service中实例这个Binder
3.在onBind()中返回这个Binder
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
当然还是那句话,方法有好几种,这里就讲下我认为最好用的。
主要使用到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总结 - Menu
- Android快速入门
- [Android Studio] Gradle项目中添加JNI生成文件(.so文件)
- java.lang.ClassCastException: android.app.Application cannot be cast to
- android项目结构优化
- Android多线程编程方法及开启步骤
- Android Fragment 你应该知道的一切
- PhoneGap2.9.0本地将html打包成Android应用
- Android推送技术研究
- android studio编译异常处理
- android 自带 浏览器的默认标签
- android之html Unicode编码转汉字
- Android 开发环境搭建
- android性能优化视频
- Android官方开发文档Training系列课程中文版:数据存储之键值对序列存储
- android从零单排之home键的屏蔽与复写
- android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明
- Android 一键加速原理
- 强制隐藏android键盘
- Android属性动画完全解析(上),初识属性动画的基本用法