前言
正文
一、Android 中实现定时任务的几种方式
1. java 中的 Timer 类
分享一个 Timer 详解链接: http://blog.csdn.net/zuolongsnail/article/details/8168689
- Timer 类适合短期在后台运行的定时任务,而不适合长期的,因为现在的手机都有自己的休眠策略,Android 手机会在长时间不操作的情况下会自动让 CPU 进入到休眠状态,这就有可能导致 Timer 中的定时任务无法正常运行。
2. Handler
分享一个链接: http://blog.csdn.net/dxpqxb/article/details/8659292
- Handler post系列方法中有定时发送消息的操作,如:handler.postDelayed();
3. Android 中的 Alarm 机制
Alarm 机制具有唤醒 CPU 的功能,它能保证在多数情况下需要执行定时任务的时候 CPU 都能正常工作,下面会详细介绍
Alarm 需要在 API 19 及其以上才能使用。
经测试,Alarm 有毫秒级别的误差
|
|
二、 Alarm 机制
1. 核心类: AlarmManager
|
|
2. 调用 AlarmManager 的 set() 系列方法就可以设置一个定时任务
|
|
set 系列方法三个参数详解
- 第一个参数有四个选项分别为:
|
|
- 第二个参数表示定时任务的触发时间:
如果第一个参数使用的是 ELAPSED_REALTIME 或者 ELAPSED_REALTIME_WAKEUP ,则这里就传入开机时间加上延迟执行的时间。
获取开机至今所经历的时间的毫秒数方法为:SystemClock.elapsedRealtime();
如果第一个参数使用的是 RTC 或者 RTC_WAKEUP,则这里就传入从 1970 年 1 月 1 日 0 点至今所经历时间的毫秒数加上延迟执行的时间。
获取从 1970 年 1 月 1 日 0 点至今所经历的时间的毫秒数的方法为:System.currentTimeMillis();
- 第三个参数是一个 PendingIntent ,表示一个后台可以长时间运行的服务
set() 和 setExact() 的区别
从 Android 4.4 系统开始,Alarm 任务的触发事件将会变得不准确,有可能会延迟一段时间后任务才能执行,但这并不是 bug,而是系统在耗电方面进行的优化。系统会自动监测目前有多少个 Alarm 任务存在,然后触发时间相近的几个任务会放在一起执行,这就可以大幅度减少 CPU 被唤醒的次数,从而有效延长电池的使用时间。
如果要求 Alarm 任务的执行时间必须准确无误,Android 仍然提供了解决方案,使用 setExact() 方法来代替 set() 方法。
3. 完整的代码
- Activity 中
|
|
- Service 中的代码
|
|
4. 另外需要注意的事项
- 取消定时任务
|
|
- Alarm 也能定时发送广播
|
|
- 还有一系列其他的操作,有待发掘