Android Alarm定时任务基础

时间:2022-02-19 21:50:16

本文参考自《第一行代码》

Android中定时任务有两种实现方式:
1、用 Java API 中的 Timer 类;
2、用 Android 的 Alarm 机制;
因为Android手机在长时间不使用时会让CPU自动进入睡眠状态,有可能导致Timer中的定时任务无法正常运行;
Alarm 机制则不存在这个问题,它具有CPU唤醒功能,可以保证每次需要执行定时任务时CPU都能正常工作。

Alarm 机制基本用法
1、获取一个 AlarmManager 实例

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

2、调用set()方法设置定时任务

long triggerAtTime = SystemClock.elapsedrealtime() + 10 * 1000;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WEAKUP, triggerAtTime, pendingIntent);

set()有三个参数
Parameters:
type One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, or RTC_WAKEUP.
triggerAtMillis time in milliseconds that the alarm should go off, using the appropriate clock (depending on the alarm type).
operation Action to perform when the alarm goes off; typically comes from IntentSender.getBroadcast().

type 的四个选择:
ELAPSED_REALTIME:让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU;
ELAPSED_REALTIME_WAKEUP:让定时任务的触发时间从系统开机开始算起,会唤醒CPU;
RTC:让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒CPU;
RTC_WAKEUP:让定时任务的触发时间从1970年1月1日0点开始算起,会唤醒CPU;

triggerAtMillis 就是定时任务触发的时间,以毫秒为单位。如果第一个参数使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。如果第一个参数使用的是RTC或RTC_WAKEUP,则这里传入1970年1月1日0点至今的时间再加上延迟执行的时间。

operation 是一个PendingIntent。这里我们一般会调用getBroadcast()方法获取一个能够执行广播的PendingIntent。这样当定时任务被触发时,广播接收器的onReceive()方法就能得到执行。

SystemClock.elapsedrealtime()方法可以获取到系统开机至今所经历时间的毫秒数;
System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数;

以上就是Alarm机制的基本用法,在下一篇文章中会做一个在后台执行定时任务的小项目。