AlarmManager 定时任务详解
AlarmManager的使用
使用场景
- 应用保活
- 设置闹铃
- 发送心跳包
功能说明:设置一个在未来的某个时间运行应用的PendingIntent 或者OnAlarmListener ,即使设备已经进入睡眠已设置的闹铃也会被保持,只有当设备关闭或是重启的时候会被清除
AlarmManager 对象获取
//AlarmManager 系统服务的获取方式
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
AlarmManager 提供的api介绍
1. 统一参数说明
AlarmType类型:
时间参照物,是否在休眠时候唤起
AlarmType | 时间参照物 | 是否在休眠时候唤起设备 |
---|---|---|
public static final int RTC_WAKEUP = 0 | System.currentTimeMillis() ,当前系统的时间,单位ms | 是 |
public static final int RTC = 1 | System.currentTimeMillis(),当前系统的时间,单位ms | 否 |
public static final int ELAPSED_REALTIME_WAKEUP = 2 | SystemClock.elapsedRealtime() ,从系统启动到目前的时间(包括系统休眠),单位ms | 是 |
public static final int ELAPSED_REALTIME = 3 | SystemClock.elapsedRealtime(),从系统启动到目前的时间(包括系统休眠),单位ms | 否 |
tips: | ||
System.currentTimeMillis()的时间和实际时间可能不准,这个时间可以在设置中修改 | ||
常说的Unix 时间戳=System.currentTimeMillis()/1000 单位秒 |
定时任务触发类型
PendingIntent ,OnAlarmListener
任务触发类型 | 说明 |
---|---|
PendingIntent | 挂起的意图 |
OnAlarmListener | 直接回调接口的 public void onAlarm() 方法 |
2. 功能方法
- 设置定时任务相关方法
设置单次的定时任务 | 参数说明 |
---|---|
set(@AlarmType int type, long triggerAtMillis, PendingIntent operation) | triggerAtMillis:触发执行的时间;operation:挂起待执行的意图 |
set(@AlarmType int type, long triggerAtMillis, String tag, OnAlarmListener listener,Handler targetHandler) | listener:待执行的回调;targetHandler:回调执行 |
设置单次准确的定时任务 | |
public void setExact(@AlarmType int type, long triggerAtMillis, PendingIntent operation) | – |
public void setAlarmClock(AlarmClockInfo info, PendingIntent operation) | 同上,type=RTC_WAKEUP |
public void setExact(@AlarmType int type, long triggerAtMillis, String tag, OnAlarmListener listener, Handler targetHandler) | – |
设置循环的定时任务 | |
public void setRepeating(@AlarmType int type, long triggerAtMillis,long intervalMillis, PendingIntent operation) | 这个循环定时,时间是精确地 |
public void setInexactRepeating(@AlarmType int type, long triggerAtMillis,long intervalMillis, PendingIntent operation) | 与上面相反,是不精确的 |
设置在低功耗条件下也执行的定时任务 | – |
public void setAndAllowWhileIdle(@AlarmType int type, long triggerAtMillis,PendingIntent operation) | 这个单次定时,时间是不精确地,与系统版本有关 |
public void setExactAndAllowWhileIdle(@AlarmType int type, long triggerAtMillis,PendingIntent operation) | 与上面相反,是精确的 |
设置在时间段执行的定时任务 | – |
public void setWindow(@AlarmType int type, long windowStartMillis, long windowLengthMillis,PendingIntent operation) | 时间段左边界,时间段右边界 |
public void setWindow(@AlarmType int type, long windowStartMillis, long windowLengthMillis,String tag, OnAlarmListener listener, Handler targetHandler) | 同上 |
- 取消定时任务相关方法
方法 | 说明 |
---|---|
public void cancel(PendingIntent operation) | 根据PendingIntent 取消定时任务 |
public void cancel(OnAlarmListener listener) | 根据OnAlarmListener 取消定时任务 |
- 其他方法(设置系统时间、时区,获取下一次定时任务的信息)
方法 | 说明 |
---|---|
public void setTime(long millis) | 设置系统时间,需要权限android.permission.SET_TIME |
public void setTimeZone(String timeZone) | 设置系统时区,对所有apps生效;TimeZone.setDefault设置时区,只在当前app生效 |
public AlarmClockInfo getNextAlarmClock() | 获取下一次定时任务信息,没有就为null |
tips:
setTimeZone(String timeZone)的参数timeZone,在sdk>=Build.VERSION_CODES.M(23),TimeZone#getAvailableIDs()中字符串会抛出IllegalArgumentException
android不同版本对AlarmManager的影响
版本节点 | 影响 | 原因 | 解决办法 |
---|---|---|---|
SDK < 19 | 使用 set() 或 setRepeating() 创建的闹铃是精确的 | 如果您已将 targetSdkVersion 设置为“18”或更低版本,那么在 Android 4.4 上运行时,您的闹铃的行为方式和在以前版本上一样 | |
19=<SDK < 23 | 使用 set() 或 setRepeating() 创建的闹铃将变得不准确 | 为提高电源效率,Android 现在批处理在合理的相似时间发生的所有应用的闹铃,以便系统仅唤醒设备一次,而不是多次唤醒设备来处理每个闹 | 无需精确建议使用新的 setWindow() 方法;任然需要精确的时钟时间(例如,日历事件提醒),那么您可以使用新的 setExact() 方法 |
23=<SDK | 在低电耗模式下,您的应用会受到以下限制:系统忽略唤醒锁定;标准 AlarmManager 闹钟(包括 setExact() 和 setWindow())推迟到下一个维护期 | 针对低电耗模式和应用待机模式进行优化 | 如果您需要设置在设备处于低电耗模式时触发的闹钟,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。使用 setAlarmClock() 设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式 |
tips: | |||
版本4.4(19)变更说明:https://developer.android.google.cn/about/versions/android-4.4 | |||
版本6.0(23)变更说明:https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes | |||
6.0变更具体位置,低电耗模式和应用待机模式:https://developer.android.google.cn/training/monitoring-device-state/doze-standby |
程序杀死后定时任务不执行
定时任务不执行的原因是程序进程停止运行了
- 通过在启动的广播manifest.xml中添加
android:process=":myReceiver"
- android8.0不能有静态广播,那就添加一个前台服务,在启动定时器任务前打开前台服务,前台服务最近历史列表中杀不死,除非在设置里面杀死
AlarmManager与Timer的区别
上下文依赖 | |
---|---|
AlarmManager | android系统提供的系统服务功能,只有当系统关机或者重启任务才会失败不执行;能唤醒休眠锁,可在休眠时候执行 |
Timer | 依赖于线程,线程又依赖于启动线程的app进程,也就是说程序杀死就终止;不能唤醒休眠锁,系统休眠会停止运行 |
AlarmManagerCompat版本兼容处理
implementation "com.android.support:support-compat:28.0.0"
//或者
implementation "androidx.core:core:1.3.0"
AlarmManagerCompat 代码:
public final class AlarmManagerCompat {public static void setAlarmClock(@NonNull AlarmManager alarmManager, long triggerTime, @NonNull PendingIntent showIntent, @NonNull PendingIntent operation) {if (VERSION.SDK_INT >= 21) {alarmManager.setAlarmClock(new AlarmClockInfo(triggerTime, showIntent), operation);} else {setExact(alarmManager, 0, triggerTime, operation);}}public static void setAndAllowWhileIdle(@NonNull AlarmManager alarmManager, int type, long triggerAtMillis, @NonNull PendingIntent operation) {if (VERSION.SDK_INT >= 23) {alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation);} else {alarmManager.set(type, triggerAtMillis, operation);}}public static void setExact(@NonNull AlarmManager alarmManager, int type, long triggerAtMillis, @NonNull PendingIntent operation) {if (VERSION.SDK_INT >= 19) {alarmManager.setExact(type, triggerAtMillis, operation);} else {alarmManager.set(type, triggerAtMillis, operation);}}public static void setExactAndAllowWhileIdle(@NonNull AlarmManager alarmManager, int type, long triggerAtMillis, @NonNull PendingIntent operation) {if (VERSION.SDK_INT >= 23) {alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);} else {setExact(alarmManager, type, triggerAtMillis, operation);}}private AlarmManagerCompat() {}
}
tips:
不多说AlarmManagerCompat 做了一些简单的版本兼容性处理
AlarmManager使用实例
- 精准单次的定时任务
- 精准循环的定时任务
AlarmManager,JobScheduler,WorkManager的功能
服务 | 功能介绍 | 版本问题 |
---|---|---|
AlarmManager | 提供在将来的某个时刻运行你的程序 | API 19开始运行时间传递不精准 |
JobScheduler | 提供特定时间并满足某些条件后运行你的程序 | API 21开始使用, |
WorkManager | 是以上两个的进一步封装,Jetpack中的组件 | WorkManager requires compileSdk version 28 or higher |
此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!
AlarmManager 定时任务详解相关推荐
- android alarmmanager定时任务,AlarmManager 定时任务详解
功能说明 设置一个在未来的某个时间运行应用的PendingIntent 或者OnAlarmListener 即使设备已经进入睡眠已设置的闹铃也会被保持 只有当设备关闭或是重启的时候会被清除 Alarm ...
- navicat创建MySql定时任务详解
目录 navicat创建MySql 定时任务详解 一.开起定时任务 二.通过navicat创建定时任务 三.关闭.启动.别名.移动.删除event 四.查询Event信息 navicat创建MySql ...
- kettle工具下载、安装、数据迁移、定时任务详解
kettle工具下载.安装.数据迁移.定时任务详解 篇幅有点长,将这五个内容放在了一篇文章里,其中最主要的是数据迁移和定时任务 目录 目录 一.简单介绍 二.下载 三.安装 四.数据迁移:包括单表整体 ...
- Spring整合Schedule定时任务详解
Spring整合Schedule定时任务详解 Spring 定时任务官方网站 一.概述 用Spring,就是为了简单. 但是我还是要总结下java定时任务实现的几种方式. 1.TimerTask,等于 ...
- Linux的定时任务详解
Linux的定时任务详解 文章目录 一 什么是定时任务? 二 控制定时任务 三 crontab命令 四 实际运用定时任务 五 会遇到的问题及解决方法 5.1 权限问题 5.2 脚本注意问题 一 什么是 ...
- Linux中实现定时任务详解
一.at命令 1.at服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业. service atd start //启动服务 service atd stop //关 ...
- Python APScheduler 定时任务详解
目录 一.基本概念 1.1. 触发器:triggers 1.2.作业存储器:job stores 1.3.执行器 executors 1.4.调度器 schedulers 二.调度器详解 2.1.AP ...
- laravel5.5的定时任务详解(demo)
一.准备环境 服务器:linux(debian)+nginx+mysql+php 环境 框架:laravel 5.5 (确认能跑通) 需求:每天晚上1点执行定时操作 二.定时任务的步骤 1.根据文档, ...
- Java之定时任务详解
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 在 ...
最新文章
- 为何把日志打印到控制台很慢?
- Android传感器编程入门
- 方法引用、构造器引用和数组引用
- 最高的分数(信息学奥赛一本通-T1062)
- IOS机型margin属性无效问题
- centos安装python3小白_centos7安装python3
- swagger默认访问地址
- 常见的windows蓝屏代码查询及处理
- 1. -vinc- = -vict- 胜利,征服
- CentOS官网下载所需版本的CentOS版本方法
- 深圳台电:联合国的“沟通”之道
- 扫描仪显示计算机繁忙或故障,为什么我的兄弟打印机每次扫描图像文件总是显示连接计算机,但是电脑就没有弹出那个框让我选择?请求高手...
- 济南市公安局人口数据备份库项目(数据复制)之二
- brain segmentation调研--Brain Parcellation as a Pretext Tas
- Windows系统中VMWare虚拟机屏幕分辨率调整
- 主打“极致性价比”的酷玩7,能否让酷派再现辉煌?
- 各种类型sizeof大小及C++有符号数与无符号数进行比较
- SPICE、IBIS等几种PCB信号完整性分析模型分析
- Excel设置下拉选项的方法
- DTMF信号系统的Matlab仿真