对于一个闹钟应用的实现,个人觉得最主要的应该要属于AlarmManager了。AlarmManager称为全局定时器,字面意思就是闹钟管理(请原谅我蹩脚的英语),是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent(这货在调用系统发送短信的时候也有,找个时间温习下Intent,顺带把这个也好好学习下),PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。
PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,用于即将发生的事情
//定义一个PendingIntent对象,此处先照样画葫芦,下次学了再细讲
PendingIntent pi = PendingIntent.getBroadcast(Context, int, Intent, int);
二、AlarmManager常用方法简介
AlarmManager类提供的常用方法主要有一下几个:
复制代码
public void set(int type, long triggerAtMillis, PendingIntent operation)
功能:用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示触发这个闹钟要等待的时间,与type相关(不懂英文就查字典吧,我也是查了才理解这个参数的意思的),
第三个参数闹钟响应的动作
参数:type: AlarmManager.ELAPSED_REALTIME 表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
AlarmManager.ELAPSED_REALTIME_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;
AlarmManager.RTC 表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;指定系统时间System.currentTimeMillis()与triggerAtMillis相等时启动operation所对应的组件
AlarmManager.RTC_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;
AlarmManager.POWER_OFF_WAKEUP 表示闹钟在手机关机状态下也能正常进行提示功能,该状态下闹钟也是用绝对时间,状态值为4;不过我测试的时候并没有
这个常量,估计和SDK有关
operation 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。
public void setExact(int type, long triggerAtMillis, PendingIntent operation)
功能:在规定的时间精确的执行闹钟,这个函数应该是闹钟执行精度比较高吧
public void setRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation)
功能:该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示触发这个闹钟要等待的时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
public void setInexactRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation)
功能:设置一个重复闹钟的不精确版本,它相对而言更节能一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。由于不是精确版,所以这里的intervaMills
会略有不同
参数:intervalMillis: INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
public void cancel(PendingIntent operation)
功能:取消一个设置的闹钟,移除任意匹配意图的闹钟
public void setTimeZone(String timeZone)
功能:设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限