快过年了,更新春节前的最后一篇博客。 最近在做一个需求:客户端按照规定的时间间隔向服务端发送定位。一看到这个需求就想到了使用 AlarmManager 来实现。...其实答案非常简单,相对于 Handler 来说,使用 sendEmptyMessageDelayed 方法是依赖于 Handler 所在的线程的,如果线程结束,就起不到定时任务的效果;而 AlarmManager...而至于 Timer 可以精确地做到定时操作,但是相比于 AlarmManager 而言还是差了一截。同理,如果手机关屏后长时间不使用, CPU 就会进入休眠模式。...所以如果设置为 AlarmManager.RTC_WAKEUP ,那么可以通过修改手机系统的时间来提前触发定时事件。...你会发现在 Android 4.4 及以上版本的定时任务不是按照规定时间间隔来执行的。比如你设置了每隔 3 分钟发出一个 HTTP 请求,结果你一看莫名其妙地变成了隔 5 分钟发一次。
该操作耗电量非常大 ; AlarmManager 可以一定程度上替代上述 WeakLock , 并且可以稳定每隔一段时间唤醒 CPU , 避免了 CPU 全程唤醒的情况 , 同时也降低了耗电量 ; 一...、AlarmManager 简介 ---- AlarmManager 简介 : ① 激活时间 : AlarmManager 可以脱离于应用生命周期限制 , 每隔一段时间 , 定期执行任务 ; 即使应用没有执行..., 或者手机处于休眠状态 , 也可以触发执行操作 ; ② 间隔设定 : 开发者可以设定触发任务执行的周期 , 该任务一般是通过发送延迟意图 PendingIntent 实现 ; ③ 广播接收者 : 一般使用..., 使用 AlarmManager 每隔一段时间 , 唤醒一次 , 执行任务 , 然后继续休眠 , 可以极大降低资源消耗 ; 二、使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作...(ALARM_SERVICE); // 设置闹钟管理器每隔 50 秒发送一次延迟意图 mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
调度重复的闹钟 闹钟(基于AlarmManager类)给予你一种在应用使用期之外执行与时间相关的操作的方法。你可以使用闹钟初始化一个长时间的操作,例如每天开启一次后台服务,下载当日的天气预报。...尽量让你的闹钟频率最小; 如果不是必要的情况,不要唤醒设备(这一点与闹钟的类型有关,本节课后续部分会提到); 触发闹钟的时间不必过度精确; 尽量使用 setInexactRepeating()方法替代...如果触发时间是过去的某个时间点,闹钟会立即被触发; 闹钟间隔时间。例如,一天一次,每小时一次,每五秒一次,等等; 在闹钟被触发时才被发出的Pending Intent。...如果你只是简单的希望闹钟在一个特定的时间间隔被激活(例如每半小时一次),那么你可以使用任意一种 ELAPSED_REALTIME类型的闹钟,通常这会是一个更好的选择。...对于另一些实时性要求较高的应用——例如,闹钟需要精确地在上午8点半被激活,并且自此之后每隔1小时激活一次——那么可以使用 setRepeating()。不过你应该尽量避免使用精确的闹钟。
, 这里设为1分钟闹一次,在第2步我们将每隔1分钟收到一次广播 //int interval = 60 * 1000; //am.setRepeating(AlarmManager.RTC_WAKEUP...后来我发现问题出在第二个参数上 我对他的理解是错误的 我之前以为它是“延迟”时间,而实际它是“启动”时间。...如果使用RTC_WAKEUP类型 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间 alarmManager.set(AlarmManager.RTC_WAKEUP...triggerAtTime:第1次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。 interval:表示执行的时间间隔,单位是毫秒。...但与Intent不同的是,PendingIntent可以脱离应用程序而存在。 以上就是本文的全部内容,希望对大家的学习有所帮助。
不过其两个闹钟执行的间隔时间不是固定的。它相对而言更省电一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。...参数详解 type:闹钟类型 ELAPSED_REALTIME:在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。...如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。...long intervalTime:执行时间 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。...),那么本属性就得使用绝对时间,比如当前时间就表示为:System.currentTimeMillis() long startTime:间隔时间 对于周期定时方式来说,存在本属性,表示两次闹钟执行的间隔时间
(可配置)去计算线程池的活跃度,达到配置的threshold阈值后会触发一次告警,告警间隔内多次触发不会发送告警通知 [675f7b2732ba46ae9a0539ec69698c6b~tplv-k3u1fbpfcp-zoom...-1.image] *** 队列容量告警 容量使用率 = queueSize / queueCapacity 服务启动后会开启一个定时监控任务,每隔一定时间去计算任务队列的使用率,达到配置的threshold...且判断如果周期累计值达到配置的阈值,则会触发一次告警通知(同时重置周期累加值为0及上次告警时间为当前时间),告警间隔内多次触发不会发送告警通知 [651049fe286f4cb099ab8936bfc4b425...且判断如果周期累计值达到配置的阈值,则会触发一次告警通知(同时重置周期累加值为0及上次告警时间为当前时间),告警间隔内多次触发不会发送告警通知 @Override public void execute...且判断如果周期累计值达到配置的阈值,则会触发一次告警通知(同时重置周期累加值为0及上次告警时间为当前时间),告警间隔内多次触发不会发送告警通知 @Override protected void afterExecute
并且定时器来源于系统服务,即使App已经不在运行了,也能收到定时器发出的广播而被唤醒。...原本该方法可指定每隔固定时间就发送定时广播,但在Android4.4之后,操作系统为了节能省电,将会自动调整定时器唤醒的时间。...比如原来调用setRepeating方法设定了每隔10秒发送广播,但App在实际运行过程中,很可能过了好几分钟才发送一次广播,这意味着该方法将不再保证每次工作都在开发者设置的时间开始。...static int mDelay = 3000; // 设置定时任务,注意setRepeating的时间间隔并不可靠,只能调用set方法间接实现定时 private void...然而休眠模式的本意是挂起包括定时任务在内的App事务,现在却提供setAndAllowWhileIdle方法留下了后门,为开发者的鸡鸣狗盗之事大开方便,如此规定岂不是贻笑大方?
其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动、间隔多久再次运行等等。 Timer的调度方法是schedule,主要有三个参数。...第一个参数表示定时器类型,第二个参数表示任务首次执行时间,第三个参数表示再次执行的间隔时间,第四个参数表示定时任务。...: 表示定时器即使在睡眠状态下也会启用,此时定时器使用相对时间(相对于系统启动开始) ELAPSED_REALTIME : 表示定时器在睡眠状态下不可用,此时定时器使用相对时间 因为AlarmManager...的启动标志,具体取值说明如下: FLAG_ONE_SHOT : 此时启动的PendingIntent只能使用一次。...如果已存在描述的PendingIntent,则更新而不是取消该任务。 使用示例 下面是两种定时方式的效果图: ?
IDLE_MAINTENANCE:处理挂起任务 如下图所示,Doze期间提供间隔一小段时间(30s)供应用程序使用网络和处理挂起的活动。...从这张图我们可以看到,系统进入Doze模式后,系统会隔一段时间处理正在挂起的任务,随着时间推移,后面间隔的时间会越来越长,以此来减少电量消耗。...如果设备空闲很长一段时间,系统将允许空闲App一天一次访问网络。...Doze和App Standby的区别: Doze模式需要屏幕关闭(通常晚上睡觉或长时间屏幕关闭才会进入),而App Standby不需要屏幕关闭,App进入后台一段时间也会受到连接网络等限制。...由于这个原因,官方建议:如果你的应用需要消息传递与后端服务集成,我们强烈建议尽可能的使用GCM,而不是单独维护自己的网络链接。
Quartz的主要接口类是Schedule、Job、Trigger,而触发器Trigger就是定时任务的触发时间,它规定安排了关联的任务会在什么时候执行,并且表明了再次执行的时机。...“结束时间”的属性会重写重复的次数,这可能是有用的,如果你想创建一个触发器,如每10秒触发一次,直到一个给定的时刻,而不是要计算的次数,它会在开始时间和结束时间重复执行。...,每10s执行一次,共执行10次的触发器 使用SimpleScheduleBuilder的withIntervalInSeconds(N)方法可以指定间隔N秒就执行一次;withRepeatCount(...MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT - 如果熄火,会告诉Quartz想要现在就执行一次(即使现在不是它原本计划的触发时间...特别是基于日历的概念,而不是对具体间隔的行为。
这篇文章使用AlarmManager实现了Android定时后台循环任务。使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息。...AlarmManager简介 AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。...简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent。...1.AlarmService类 /** * 一个定时任务 */ public class AlarmService extends Service { /** * 每1分钟更新一次数据...()+ONE_Miniute;//从开机到现在的毫秒书(手机睡眠(sleep)的时间也包括在内 Intent i=new Intent(this, AlarmReceive.class);
指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。 它适合的任务类似于:9:00 开始,每隔1小时,每隔几分钟,每隔几秒钟执行一次。...但是不同的是SimpleTrigger指定的时间间隔为毫秒,没办法指定每隔一个月执行一次(每月的时间间隔不是固定值),而CalendarIntervalTrigger支持的间隔单位有秒,分钟,小时,天,...相较于SimpleTrigger有两个优势: 1、更方便,比如每隔1小时执行,你不用自己去计算1小时等于多少毫秒。 2、支持不是固定长度的间隔,比如间隔为月和年。但劣势是精度只能到秒。...它适合的任务类似于:指定每天9:00 至 18:00 ,每隔70秒执行一次,并且只要周一至周五执行。...基本上它覆盖了以上三个Trigger的绝大部分能力(但不是全部) CronTrigger 允许设定非常复杂的触发时间表。
本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1、开启服务;2、在不不预览的情况下...3、使用AlarmManager进行定时操作。...</manifest 服务代码如下: package com.yang.service; import java.io.IOException; import android.app.AlarmManager..., System.currentTimeMillis(), 1000 * 10, pi);// 马上开始,每1分钟触发一次 } @Override public int onStartCommand...,希望对大家的学习有所帮助。
人每天都要喝8杯水才能保持健康,于是苦逼的程序员总是一遍代码就忘了时间,于是我突发奇想能不能开发一个apk能够实现固定的间隔时间定时提醒我要喝水了呢?...apk基本功能: 1)能够设置间隔时间 2)在apk应用被停止的情况下仍然能定时提醒 3)能够播放指定闹铃 4)能够及时终止提醒 效果图: 设置间隔 ?...2)间隔时间提醒。这里采用的是Android的Alarm机制。 Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制。...而Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候CPU都能正常工作。需要注意,这里唤醒CPU和唤醒屏幕完全不是一个概念。...因为第一次开启任务的时候不需要新建一个AlertDialog(用户第一次开启任务的时候是设置好时间并且点击了“开启”,这个时候不需要创建Dialog)。
,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。...setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已...从API 19开始,AlarmManager的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。...解决遇到的坑 API 19以后如何设置重复闹钟 我们知道,我们在使用AlarmManager设置了提醒之后,是通过广播接收的,设置的提醒时间一到,系统发送我们自定义的广播,我们接收到,应用程序提醒。...那提醒的时候,我们可以再重新设置一次嘛,这就解决了API 19设置重复闹钟的问题。 根据判断系统版本,使用不同的设置闹钟的方法,进行设置。接下来我们通过广播接收系统发来的通知,进行闹钟提醒。
如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。...使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。...当使用'L'选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。 'W' 字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。...注意,对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。...这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。 Quartz Cron 表达式(时间格式的写法)
的onStartCommand()方法可能会重复调用多次;而onCreate()方法和onDestroy()方法只会调用一次。...第二个参数就是定时任务触发的时间,以毫秒为单位。如果第一个参数使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP则这里传入开机至今的时间在加上延迟执行的时间。...Alarm机制的用法,先是获取到了AlarmManager的实例,然后定义任务的触发时间为10秒,在使用PendingIntent指定处理定时任务的广播接收器为AlarmReceiver,最后调用set...另外需要注意的是,从android4.4版开始,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这并不是bug,而是系统在耗电方面进行的优化。...系统会自动检测目前有多少Alarm任务存在,然后将触发时间将近的几个任务存放在一起执行,这就可以大幅度减少cpu被唤醒的次数,从而有效延长电池的使用时间。
JDK原生定时工具:Timer 定时任务调度:基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务。...Task的时间间隔,单位是毫秒 delay:执行task任务前的延时时间,单位是毫秒 很显然,通过上述的描述,我们可以实现: 延迟多久后执行一次任务;指定时间执行一次任务;延迟一段时间,并周期性执行任务...scheduleAtFixedRate:每次执行时间为上一次任务开始起向后推一个period间隔,也就是说下次执行时间相对于上一次任务开始的时间点,因此执行时间不会延后,但是存在任务并发执行的问题。...schedule:每次执行时间为上一次任务结束后推一个period间隔,也就是说下次执行时间相对于上一次任务结束的时间点,因此执行时间会不断延后。...每天下午的 2点到2点59分(整点开始,每隔5分触发) 0 0/5 14,18 * * ?
JDK原生定时工具:Timer 定时任务调度:基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务。...scheduleAtFixedRate:每次执行时间为上一次任务开始起向后推一个period间隔,也就是说下次执行时间相对于上一次任务开始的时间点,因此执行时间不会延后,但是存在任务并发执行的问题。...schedule:每次执行时间为上一次任务结束后推一个period间隔,也就是说下次执行时间相对于上一次任务结束的时间点,因此执行时间会不断延后。...每天下午的 2点到2点59分(整点开始,每隔5分触发) 0 0/5 14,18 ? 每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发) 0 0-5 14 ?...然后,就是一些触发器、调度器的配置了,这里不再展开介绍了,只要弄懂了原生的Quartz的使用,那么和Spring的结合使用就会很简单。 如果觉得我的分享不错,欢迎大家随手点赞、转发。
以上两种类型,和日期的时间无关,不受时区,地区影响。 适用于以固定间隔重复的alarm,比如每半小时触发一次。 (3)AlarmManager.RTC表示闹钟在睡眠状态下,这种类型的闹铃不会唤醒系统。...适用于在一天某个特定的时间点触发的alarm. (5)AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能(关机闹钟)。...如果设置了这个FLAG,表示描述的PendingIntent对象不存在,它会返回null而不是去创建它。 (4)FLAG_ONE_SHOT:创建的PendingIntent对象只使用一次。...这种方式一方面更符合用户的使用场景(比我们不断去调节时间看产品表现更接近用户场景),一方面可以更直观集中地发现的问题(如多触发/不触发/触发不准时/触发后数据不正常等)。...3)对定时重复的alarm,特别是触发网络操作,应该用一个随机的时间点,而不是固定在同一个时间点,以免服务器负载过重。 4)建议采用alarm+handler的方式来控制定时任务。
领取专属 10元无门槛券
手把手带您无忧上云