Android中的AlarmManager功能很强大,它是一个全局定时器,可以在指定时间或者指定周期启动其他组件(包括Activity、Service、BroadcastReceiver)。
使用AlarmManager编程也很简单,只要按照以下步骤即可:
1.获取AlarmManager对象;
2.创建PendingIntent对象;
3.设定执行任务的时间和周期。
下面将详细介绍各个步骤:
AlarmManager是一个系统服务,在Android应用中可以通过Context对象的getSystemService()方法来获取AlarmManager对象,如下代码所示:
获取了AlarmManager对象之后就可以调用它的方法来设置定时启动指定组件。
常用的有如下几个方法:
1. type 定时任务的类型,该参数可以接收如下值:
2. triggerAtTime 定时任务首次触发的时间,是一个毫秒值,该参数值的含义受type参数影响,二者具体的对应关系如下:
type | triggerAtTime |
ELAPSED_REALTIME ELAPSED_REALTIME_WAKEUP |
相对系统启动的时间。要获取当前时间相对系统启动的时间用SystemClock.elapsedRealtime()方法。 例如:我想在开机一个小时后执行某个任务,那么这里的triggerAtTime的值就应该是1小时的毫秒值(360 0000 millis). |
RTC RTC_WAKEUP |
绝对时间,即和1970年1月1日00:00:00时间上的差值,以毫秒为单位。此时定时任务第一次触发的条件是当系统调用System.currentTimeMillis()方法的返回值与triggerAtTime相等。 |
3. interval 定时任务执行的周期
4. operation 是一个PendingIntent对象,代表闹钟需要执行的动作,如启动Activity、Service,发送广播等。
PendingIntent是Intent的封装类,代表一个延迟执行的意图。需要注意的是,如果希望到设定的时间启动Service,则应该采用PendingIntent.getService(Context context, int requestCode, Intent intent, int flags)方法来获取PendingIntent对象;如果希望到设定的时间发送Broadcast,则PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)方法;如果希望到设定的时间启动Activity,则PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。另外,还有一个PendingIntent.getActivities(Context context, int requestCode, Intent[] intents, int flags)方法,允许传入一个Intent数组,这样就可以同时启动多个Activity。
说了这么多,接下来就用代码来演示一下吧。
很简单,AlarmManager有一个方法cancel(PendingIntent operation),需要注意的是,这里传入的PendingIntent 对象必须和前面设定闹钟时传入的PendingIntent 对象相等才行。两个PendingIntent 如何才算相等?
the same kind of PendingIntent (same operation, same Intent action, data, categories, and components, and same flags)
可见,要求还是挺严格的,几乎所有的东西都要一样,如果我们的程序中需要频繁地设定和取消闹钟,我们可以把这两个方法封装一下,方便使用:
在使用AlarmManager的时候还有几点需要注意:
1. 闹钟在关机或重启之后会失效。如果希望闹钟一直有效,先把闹钟信息存储到本地,然后开机启动一个Service,通过Service重新设定闹钟。
2. 如果闹钟设定的时间小于当前时间,那么闹钟事件会立即触发,如果想避免这种情况,可以在设定闹钟之前先添加一个判断,判断需要设定的时间如果小于当前时间则什么也不做。
3. 后续再发现需要注意的问题会继续补充……
转载请指明原文出处http://blog.csdn.net/fxdaniel/article/details/41150129
原文:http://www.cnblogs.com/Free-Thinker/p/6402351.html