在项目中,有这么一个功能点,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的定时机制?
在多番查阅资料后,发现网上的一片文章,写的还不错。