AlarmManager的使用
使用场景
应用保活设置闹铃发送心跳包
功能说明:设置一个在未来的某个时间运行应用的PendingIntent 或者OnAlarmListener ,即使设备已经进入睡眠已设置的闹铃也会被保持,只有当设备关闭或是重启的时候会被清除
AlarmManager 对象获取
//AlarmManager 系统服务的获取方式
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
AlarmManager 提供的api介绍
1. 统一参数说明
AlarmType类型: 时间参照物,是否在休眠时候唤起
AlarmType时间参照物是否在休眠时候唤起设备public static final int RTC_WAKEUP = 0System.currentTimeMillis() ,当前系统的时间,单位ms是public static final int RTC = 1System.currentTimeMillis(),当前系统的时间,单位ms否public static final int ELAPSED_REALTIME_WAKEUP = 2SystemClock.elapsedRealtime() ,从系统启动到目前的时间(包括系统休眠),单位ms是public static final int ELAPSED_REALTIME = 3SystemClock.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_WAKEUPpublic 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_TIMEpublic 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= 程序杀死后定时任务不执行 定时任务不执行的原因是程序进程停止运行了 通过在启动的广播manifest.xml中添加android:process=":myReceiver"android8.0不能有静态广播,那就添加一个前台服务,在启动定时器任务前打开前台服务,前台服务最近历史列表中杀不死,除非在设置里面杀死 AlarmManager与Timer的区别 上下文依赖AlarmManagerandroid系统提供的系统服务功能,只有当系统关机或者重启任务才会失败不执行;能唤醒休眠锁,可在休眠时候执行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 此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!