AlarmManager实现精准定时任务

       在项目中,有这么一个功能点,app进程中,需要实现一个定时任务,只要设备处于开机状态,每隔半个小时,就需要定时向服务器上传一次位置信息,并且只要是有网络和获取到GPS信号,进程不能死,如果进程死掉了,需要自动重启。对该点进行细分梳理,包含如下几个小功能点:
     1.进程能够实现开机启动。
     2.进程需要一直存活,并且能够自动重启。
     3.需要定时(30分钟)一次,向server端上报信息。
      针对以上三个功能点,第1和2点,实现起来,都不难,唯独第三点,在实现时,一般情况,会考虑到多种方式实现。由于没有自己查阅相关资料,在实现定时上传功能时,分别使用了三种方案,导致多花了冤枉时间,吃力不讨好,最终的结果是,定时功能不准,时间跨度越长,误差越大。
方案一. 死循环中,使用sleep方法
       for(;;)
            Tread.sleep 30分钟
方案二. timer机制
      timerTask 30分钟一次
最终方案三.AlarmManager进行精准定时
     使用系统级AlarmManager,进行精准定时,与系统闹钟的类似功能点。
     方案一和方案二的定时方案不准,主要原因是sleep和timerTask的内部线程运行的时间。在thread运行时,CPU才开始计算时间,当线程挂起,CPU没有将时间片交给该线程,就没有计算时间。实际使用中,app在后台运行越长,误差就越大。
     由于之前没有使用过AlarmManager功能,对其各个API不熟悉,并且存在如下的一些疑问:
     question 1:进程死掉后,AlarmManager是否还有效果?是否需要使用自动重启的service来重启进程?
     question 2:设备reboot后,设置的AlarmManager是否还有效?
     question 3:重复set相同的 alarm,是否会影响AlarmManager的定时机制?
     在多番查阅资料后,发现网上的一片文章,写的还不错。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值