Android中的定时任务一般有2种实现方式:1.使用Java API里面的Timer类;2.使用Android的Alarm机制。
这两种方式在多数情况下都能实现类似的效果,但是Timer有一个明显的短板,它并不适用于那些长期在后台运行的定时任务。我们都知道,为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下让CPU进入休眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次执行定时任务的时候CPU都能正常工作。这里要提醒一下,唤醒CPU和唤醒屏幕完全不是同一个概念,不能混淆。
AlarmManager实例如下:
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000; //10秒
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
其中set()方法的参数分析如下:
第一个参数有4种值可选,分别是ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP。区别如下:
ELAPSED_REALTIME 让定时任务的触发时间从系统开机开始算起,但不唤醒CPU
ELAPSED_REALTIME_WAKEUP 让定时任务的触发时间从系统开机开始算起,但会唤醒CPU
RTC 让定时任务的触发时间从1970年1月1日0点开始算起,但不唤醒CPU
RTC_WAKEUP 让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒CPU
SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,
System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数
第二个参数是依赖于第一个参数而传入的一个时间差值。(需要和第一个参数配合使用)
第三个参数就不再说了。