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后台执行定时任务相关推荐

  1. Android Service后台下载 广播(Eventbus)通知并展示

    因为好多项目都会用到比如后台下载apk,下载图片,音视频,这个时候就需要我们用Service进行后台下载了,首先讲一下我的思路一个简单的service后台图片下载展示,我需要创建一个service并注 ...

  2. Android SERVICE后台服务进程的自启动和保持

    Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...

  3. Android SERVICE后台服务进程的守护

    Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...

  4. Android Service后台多线程压缩并提交图片及数据

    手机端发帖,多张图片上传是个问题.最近重构项目代码,正好碰到这个,这里把解决的方案整理,以备后用. 方案原理: 创建上传任务表, 帖子内容发布的时候将数据存放到任务表中,并传递数据到service中. ...

  5. android服务中定时清理,Android中(Service )服务的最佳实践——后台执行的定时任务...

    Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制.这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显 ...

  6. Android Service 定时任务

    Android 中的定时任务一般有两种实现方式 (这里我们使用的是Android 的 Alarm 机制 ) 1.Java API提供的Timer类 不太适用于那些需要长期在后台运行的定时任务.我们都知 ...

  7. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  8. android后台自播放音乐,Android实现后台播放音乐(Service方式)

    Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...

  9. 134_人人后台管理系统-立即执行定时任务失败(坑)

    在人人的后台管理框架下,写了自己的定时任务,然后通过后台管理添加后,点击立即执行失败,提示:立即执行定时任务失败. 截图如下: 全局搜索这句提示,发现在抛出这个异常时,没有打印错误堆栈信息,于是改代码 ...

最新文章

  1. 前谷歌高管给初入职场新人的14条忠告
  2. 动态规划--用最少的硬币类别找零钱
  3. Python flask出现jinja2.exceptions.TemplateNotFound错误(修复host就好了???)
  4. Dominant Character 思维,字符串,贪心
  5. 数据结构与算法 / 概念
  6. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序
  7. Tricks(十七) —— 数组与字典(map)
  8. rocketmq底层通信模块解析
  9. Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
  10. Android IntentService的使用与源码解析
  11. c语言大一期中考试知识点,大一期末考试复习计划
  12. Opencv2.4.9、VS2010配置及grabcut代码实例
  13. 我是怎么薅的双十一羊毛
  14. labview调用外部仪器设备案例一(标签打印机)
  15. windows下MySQL数据库如何移动到其它盘
  16. win 10 把秘钥清掉之后查不到秘钥怎么办
  17. PhotoSwipe 官方API解读(一)
  18. leetcode 笨阶乘
  19. Wi-Fi Mesh协议(1)
  20. Linux终端光标的调整方法

热门文章

  1. 如何使用SC7A20
  2. Q2增收不增利,“怪兽”无法给自己“充电”
  3. 计算机科学技术标准,计算机科学技术基础知识之标准化和知识产权基础知识
  4. Java、计算税收(Java8)
  5. springboot注解方式实现aop及常规方式
  6. python科学计算环境配置_ATLAS + NumPy + SciPy + Theano 的Python科学计算环境搭建
  7. 百分点大数据技术团队:Cesium技术在智慧应急行业的应用
  8. html5 视差地图,用HTML5构建高性能视差网站的图文代码详解
  9. Elasticsearch监控插件Marvel的安装使用
  10. java 异常国际化_基于springboot实现http响应异常信息国际化