1. AlarmManager介绍类
AlarmManager
提供广播服务,使用PendingIntent
调用Intent
服务。
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent
用于延迟的Intent
,主要通过三种方式获取
// 启动Activity
public static PendingIntent getActivity(Context context, int requestCode,
Intent intent, @Flags int flags)
// 启动Service
public static PendingIntent getService(Context context, int requestCode,
@NonNull Intent intent, @Flags int flags)
// 发送广播
public static PendingIntent getBroadcast(Context context, int requestCode,
Intent intent, @Flags int flags)
PendingIntent
的flags
FLAG_CANCEL_CURRENT
:如果当前系统中已经存在相同的PendingIntent
对象,那么取消原有的,重新生成一个PendingIntent
对象。FLAG_NO_CREATE
:如果当前系统中不存在相同的PendingIntent
对象,系统将不会创建该PendingIntent
对象而是直接返回null
。FLAG_ONE_SHOT
:该PendingIntent
只作用一次。在该PendingIntent
对象通过send()
方法触发过后,PendingIntent
将自动调用cancel()
进行销毁,那么如果你再调用send()
方法的话,系统将会返回SendIntentException
。FLAG_UPDATE_CURRENT
:如果系统中有一个和你描述的PendingIntent
对等的PendingInent
,那么系统将使用该PendingIntent
对象,但是会使用新的Intent
来更新之前PendingIntent
中的Intent
对象数据,例如更新Intent
中的Extras
。
判断两个相同的PendingIntent
对象,主要是依据requestCode
和intent.filterEquals(Intent)
是否相同。
Intent intentA = new Intent();
intentA.putExtra("paramA", "paramA");
Intent intentB = new Intent();
intentB.putExtra("paramB", "paramB");
// intentA.filterEquals(intentB) 返回true;
2. AlarmManager的常用方法
设置闹钟
set(int type,long triggerAtMillis,PendingIntent operation)
,设置一次性闹钟,在某个时间执行闹钟setRepeating(int type,long triggerAtMillis,long intervalMillis,PendingIntent operation)
,设置重复闹钟setExact(int type, long triggerAtMillis, PendingIntent operation)
,设置一次性闹钟比set
方法设置的精度更高setInexactRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)
,设置一个非精确的周期性任务cancel(PendingIntent operation)
,取消闹钟
type
是闹钟类型
AlarmManager.ELAPSED_REALTIME
,该状态下闹钟使用相对时间(系统启动时间),手机睡眠状态下不可用AlarmManager.ELAPSED_REALTIME_WAKEUP
,该状态下闹钟使用相对时间,在睡眠状态下会唤醒系统并执行提示功能AlarmManager.RTC
,该状态下闹钟使用绝对时间(系统当前时间),手机睡眠状态下不可用AlarmManager.RTC_WAKEUP
,该状态下闹钟使用绝对时间,在睡眠状态下会唤醒系统并执行提示功能
triggerAtMillis
是触发时间,以毫秒为单位
- 如果
type
使用的是相对时间(ELAPSED_REALTIME
和ELAPSED_REALTIME_WAKEUP
),那么本属性就得使用相对时间(SystemClock.elapsedRealtime()
)。 - 如果
type
使用的是绝对时间(RTC
、RTC_WAKEUP
、POWER_OFF_WAKEUP
),那么本属性就得使用绝对时间(System.currentTimeMillis()
)。
intervalMillis
是两次闹钟的时间间隔,也是以毫秒为单位。
operation
绑定了闹钟的执行动作