1. 概述

当你的应用需要使用类似闹钟功能的时候,可以用AlarmManager来实现。

2. 原理

AlarmManager是系统的闹铃管理器,可以给它添加或删除一个闹铃,并给这个闹铃提供一个广播接收器,
当时间到达的时候,它就会给那个广播接收器发送广播,我们就可以在广播接收器的onReceive方法中
做自己的事情。

3. 代码演示

创建一个广播接收器:


/**
* Created by fanshuo on 15/3/18.
*/
public class MyAlarmReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
System.out.println("MyAlarmReceiver...");
}
}

添加一个定时提醒

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyAlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context,
1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

long triggerTime = calendar.getTimeInMillis();
am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime,
INTERVAL, sender);

setRepeating方法有四个参数,含义如下:

  • type:闹钟类型,有四个可选值

    • ELAPSED_REALTIME:以手机开机的时间为基准
    • ELAPSED_REALTIME_WAKEUP:以手机开机的时间为基准,并且可以在休眠时发出广播
    • RTC:以UTC标准时间为基准
    • RTC_WAKEUP:以UTC标准时间为基准,并且可以在休眠时发出广播
  • triggerAtTime:第一次启动的时间,单位是毫秒。如果当前时间超过了triggerTime,就会立即启动这个定时提醒。此时应该设置为triggerTime + INTERVAL,
    即:首次启动时间 + 循环间隔时间,也就是从下个循环开始启动。

    • 如果type是前两种,就需要提前算好开机后多久启动,如果超过了设定的时间会立即启动;
    • 如果type是后两种,需要设置一个标准时间的毫秒数。
  • interval:循环启动的间隔时间,单位是毫秒。也就是第一次启动之后,每隔多长时间启动一次。

  • operation:一个PendingIntent对象。这里用来封装BroadcastReceiver。

删除一个定时提醒

Intent intent = new Intent(context, MyAlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context,
1, intent, PendingIntent.FLAG_CANCEL_CURRENT);//第二个参数必须和创建时的保持一致
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);