快过年了,更新春节前的最后一篇博客。
最近在做一个需求:客户端按照规定的时间间隔向服务端发送定位。一看到这个需求就想到了使用 AlarmManager
来实现。 AlarmManager
经常被用来执行定时任务,比如设置闹铃、发送心跳包等。也许有人会有疑问:为什么不能使用相同具有定时效果的 Timer
和 Handler
呢?
其实答案非常简单,相对于 Handler
来说,使用 sendEmptyMessageDelayed
方法是依赖于 Handler
所在的线程的,如果线程结束,就起不到定时任务的效果;而 AlarmManager
依赖的是 Android 系统的服务,具备唤醒机制。比起 Handler
也就更合适了。
而至于 Timer
可以精确地做到定时操作,但是相比于 AlarmManager
而言还是差了一截。同理,如果手机关屏后长时间不使用, CPU 就会进入休眠模式。这个使用如果使用 Timer
来执行定时任务就会失败,因为 Timer
无法唤醒 CPU 。
所以,综上所述, AlarmManager
就成为了最佳选择。
SDK API < 19
一般情况下,使用 AlarmManager
来执行重复定时任务的代码如下所示:
alarmManager.setRepeating(