Android service后台执行定时任务
Android 的定时任务
1,Java的API提供的Timer类
Android 中使用容易受手机的休眠系统影响(例如:手机休眠,导致了这个功能的停止)。
2,Android的Alarm机制
Alarm 机制: 主要就是借助了AlarmManager 类来实现的。这个类和NotificationManager 有点类似,都是通过调用Context 的
getSystemService()方法来获取实例的,只是这里需要传入的参数是Context.ALARM_SERVICE。因此,获取一个AlarmManager 的实例就可以写成:
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
定时任务设置:(例如设定任务10s执行)
long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);
参数意义:
使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,使用System.currentTimeMillis()方法可以获取到1970 年1 月1 日0 点至今所经历时间的毫秒数。
第一个参数有四个值可以选
------ELAPSED_REALTIME
ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU
------ELAPSED_REALTIME_WAKEUP
ELAPSED_REALTIME_WAKEUP 同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒CPU
------RTC
RTC 表示让定时任务的触发时间从1970 年1月1 日0 点开始算起,但不会唤醒CPU
------RTC_WAKEUP
RTC_WAKEUP 同样表示让定时任务的触发时间从1970 年1 月1 日0 点开始算起,但会唤醒CPU
第二个参数
就是定时任务触发的时间,以毫秒为单位。
如果第一个参数使用的是ELAPSED_REALTIME 或ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。如果第一个参数使用的是RTC 或RTC_WAKEUP,则这里传入1970 年1 月1 日0 点至今的时间再加上延迟执行的时间。
第三个参数
PendingIntent
般会调用getBroadcast()方法来获取一个能够执行广播的PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。
设定一个任务在10 秒钟后执行还可以写成:
long triggerAtTime = System.currentTimeMillis() + 10 * 1000;
manager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
创建一个可以长期在后台执行定时任务的服务
public class LongRunningService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d("LongRunningService", "executed at " + new Date().
toString());
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int anHour = 60 * 60 * 1000; // 这是一小时的毫秒数
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent i = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
onStartCommand()方法里开启了一个子线程,然后在子线程里就可以执行具体的逻辑操作了。
新建一个AlarmReceiver 类,并让它继承自BroadcastReceiver,代码如下所示:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, LongRunningService.class);
context.startService(i);
}
}
循环流程
启动Service ----->onStartCommand()(执行定时任务(并发送广播)----->AlarmReceiver(接收广播,再次启动Service)-----
| -
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:
从Android 4.4 版本开始,Alarm 任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这并不是个bug,而是系统在耗电性方面进行的优化。系统会自动检测目前有多少Alarm 任务存在,然后将触发时间将近的几个任务放在一起执行,这就可以大幅度地减少CPU 被唤醒的次数,从而有效延长电池的使用时间。当然,如果你要求Alarm 任务的执行时间必须准备无误,Android 仍然提供了解决方案。使用AlarmManager 的setExact()方法来替代set()方法,就可以保证任务准时执行了。
Android service后台执行定时任务相关推荐
- Android Service后台下载 广播(Eventbus)通知并展示
因为好多项目都会用到比如后台下载apk,下载图片,音视频,这个时候就需要我们用Service进行后台下载了,首先讲一下我的思路一个简单的service后台图片下载展示,我需要创建一个service并注 ...
- Android SERVICE后台服务进程的自启动和保持
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...
- Android SERVICE后台服务进程的守护
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...
- Android Service后台多线程压缩并提交图片及数据
手机端发帖,多张图片上传是个问题.最近重构项目代码,正好碰到这个,这里把解决的方案整理,以备后用. 方案原理: 创建上传任务表, 帖子内容发布的时候将数据存放到任务表中,并传递数据到service中. ...
- android服务中定时清理,Android中(Service )服务的最佳实践——后台执行的定时任务...
Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制.这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显 ...
- Android Service 定时任务
Android 中的定时任务一般有两种实现方式 (这里我们使用的是Android 的 Alarm 机制 ) 1.Java API提供的Timer类 不太适用于那些需要长期在后台运行的定时任务.我们都知 ...
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...
- android后台自播放音乐,Android实现后台播放音乐(Service方式)
Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...
- 134_人人后台管理系统-立即执行定时任务失败(坑)
在人人的后台管理框架下,写了自己的定时任务,然后通过后台管理添加后,点击立即执行失败,提示:立即执行定时任务失败. 截图如下: 全局搜索这句提示,发现在抛出这个异常时,没有打印错误堆栈信息,于是改代码 ...
最新文章
- 前谷歌高管给初入职场新人的14条忠告
- 动态规划--用最少的硬币类别找零钱
- Python flask出现jinja2.exceptions.TemplateNotFound错误(修复host就好了???)
- Dominant Character 思维,字符串,贪心
- 数据结构与算法 / 概念
- 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序
- Tricks(十七) —— 数组与字典(map)
- rocketmq底层通信模块解析
- Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
- Android IntentService的使用与源码解析
- c语言大一期中考试知识点,大一期末考试复习计划
- Opencv2.4.9、VS2010配置及grabcut代码实例
- 我是怎么薅的双十一羊毛
- labview调用外部仪器设备案例一(标签打印机)
- windows下MySQL数据库如何移动到其它盘
- win 10 把秘钥清掉之后查不到秘钥怎么办
- PhotoSwipe 官方API解读(一)
- leetcode 笨阶乘
- Wi-Fi Mesh协议(1)
- Linux终端光标的调整方法
热门文章
- 如何使用SC7A20
- Q2增收不增利,“怪兽”无法给自己“充电”
- 计算机科学技术标准,计算机科学技术基础知识之标准化和知识产权基础知识
- Java、计算税收(Java8)
- springboot注解方式实现aop及常规方式
- python科学计算环境配置_ATLAS + NumPy + SciPy + Theano 的Python科学计算环境搭建
- 百分点大数据技术团队:Cesium技术在智慧应急行业的应用
- html5 视差地图,用HTML5构建高性能视差网站的图文代码详解
- Elasticsearch监控插件Marvel的安装使用
- java 异常国际化_基于springboot实现http响应异常信息国际化