Android中AlarmManager的几个重要方法详解

原创 2017年01月03日 20:03:59

一、概述:

该类提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动启动目标程序,如果它没有正在运行。注册的闹钟会被保留即使设备处于休眠中(如果闹钟在给定时间响起可以选择是否唤醒设备)。如果闹钟关闭或者重启,闹钟将被清除。

只要广播的onReceive()方法正在执行,这闹钟管理者(AlarmManager)会持有一个CPU唤醒锁,这是为了保证手机不会休眠直到处理完该广播,一旦onReceive()返回,那么闹钟管理者将会释放唤醒锁。这意味着只要OnReceive()方法完成,你的手机可能在某些情况下进入休眠,如果你的闹钟广播接收者调用的是Context.startService(),那么手机有可能在被请求的服务执行之前进入休眠,为了防止这种情况,你的BroadcastReceiver和服务需要实现一个单独的唤醒锁策略以确保手机继续运行,直到服务可用。

此处注意:该类适用于你想让应用程序在将来某个指定时间点执行的情况,即使你的应用程序现在没有运行。对一般的时间操作,使用Handler是更容易和更有效率的

二、公有方法(Public Methods):

void cancel(PendingIntent operation)

取消AlarmManager的定时服务。

void set(int type, long triggerAtTime, PendingIntent operation)

设置在triggerAtTime时间启动由operation参数指定的组件。(该方法用于设置一次性闹钟)

void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)

设置一个非精确的周期性任务。

void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)

设置一个周期性执行的定时服务。

void setTime(long millis)

设置系统“墙”时钟。需要android.permission.SET_TIME.权限。

void setTimeZone(String timeZone)

设置系统的默认时区。需要android.permission.SET_TIME_ZONE.权限。

三、常用方法说明:
AlarmManager的常用方法有三个:

(1)

set(int type,long startTime,PendingIntent pi)

该方法用于设置一次性闹钟。
第一个参数int type指定定时服务的类型,该参数接受如下值:

ELAPSED_REALTIME: 在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。

ELAPSED_REALTIME_WAKEUP: 在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件) 。
延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。

RTC: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。

RTC_WAKEUP: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行 operation所对应的组件。

第二个参数表示闹钟执行时间。

第三个参数PendingIntent pi表示闹钟响应动作:

PendingIntent pi:是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intentintent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,inti,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,inti,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。

(2)

setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)

设置一个周期性执行的定时服务。第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。

(3)

setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)

该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。它相对而言更省电(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。第三个参数intervalTime为闹钟间隔,内置的几个变量如下:

INTERVAL_DAY:      设置闹钟,间隔一天
INTERVAL_HALF_DAY:  设置闹钟,间隔半天
INTERVAL_FIFTEEN_MINUTES:设置闹钟,间隔15分钟
INTERVAL_HALF_HOUR:     设置闹钟,间隔半个小时
INTERVAL_HOUR:  设置闹钟,间隔一个小时

参考:http://yh.512876.com/diannao/276.html

1、AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。

  定义一个PendingIntent对象。

  PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0);

  2、AlarmManager的常用方法有三个:

  (1)set(int type,long startTime,PendingIntent pi);

  该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。

  (2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

  该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。

  (3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

  该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

  3、三个方法各个参数详悉:

  (1)int type: 闹钟的类型,常用的有5个值:AlarmManager.ELAPSED_REALTIME、 AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、 AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP。

  AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;

  AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;

  AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;

  AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;

  AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间,状态值为4;不过本状态好像受SDK版本影响,某些版本并不支持;

  (2)long startTime: 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关,如果第一个参数对 应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属性就得使用相对时间(相对于 系统启动时间来说),比如当前时间就表示为:SystemClock.elapsedRealtime();如果第一个参数对应的闹钟使用的是绝对时间 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间,比如当前时间就表示 为:System.currentTimeMillis()。

  (3)long intervalTime:对于后两个方法来说,存在本属性,表示两次闹钟执行的间隔时间,也是以毫秒为单位。

  (4)PendingIntent pi: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提 示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用 PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用 PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。




版权声明:本文为博主原创文章,未经博主允许不得转载。

Android利用AlarmManager执行定时任务

Android中的AlarmManager是一个全局定时器
  • fxdaniel
  • fxdaniel
  • 2014年11月15日 21:03
  • 8265

Android中的AlarmManager类

一、声明:public class AlarmManager extends Object 二、类结构: java.lang.Object    ↳ android.a...
  • u010142437
  • u010142437
  • 2014年03月25日 19:11
  • 4048

Java 线程中的几个重要方法

Java 线程中的几个重要方法start()与run()实现线程类时无论是继承Thread类还是实现Runnable接口,都要实现run()方法实现具体的线程业务逻辑,但是真正启动线程类时要注意使用s...
  • p10614040
  • p10614040
  • 2015年09月22日 22:33
  • 743

android的全局定时器AlarmManager详解

AlarmManager对象配合Intent使用,可以定时开启一个Activity,发送一个BroadCast或者开启一个Service。 AlarmManager有如下用法: (1)在指定时间后...
  • wh_19910525
  • wh_19910525
  • 2015年01月30日 12:29
  • 1656

AlarmManager api详解

转载地址:http://blog.csdn.net/aa20616012/article/details/50497536  Android API 19 及以上版本AlarmManager set...
  • lijinhua7602
  • lijinhua7602
  • 2016年03月30日 14:37
  • 1985

安卓中AlarmManager结合广播的使用

安卓中AlarmManager可以做到提醒的作用,在特定的时刻为我们广播一个特定的Intent。可以通过设置,然后传递给广播接收器,响应一些事件。 首先我们写好一个静态广播,这里为什么不适用动态注册广...
  • qq_21267961
  • qq_21267961
  • 2016年06月01日 11:21
  • 998

谈谈对Android定时任务中AlarmManager的理解

Android定时任务前言我们在平常的开发中可能会遇到一些需求,比如说,每日定时提醒,定时更新数据等等,反正就是周期性任务,碰到这类需求,我们就可以叫做定时任务。以前我们可以通过使用线程Handler...
  • qq272708698
  • qq272708698
  • 2016年09月07日 15:27
  • 3042

android Alarm的设定和取消

这几天因为案子需要,研究了一下alarm的设定和取消。众所周知,设定alarm的话,大概需要用到如下几步:1.创建一个Intent2.创建一个PendingIntent3.得到ALARM_SERVIC...
  • xijiaohuangcao
  • xijiaohuangcao
  • 2010年08月05日 17:43
  • 18612

AlarmManager的正确使用姿势

AlarmManager 这个类在 Android 开发中非常实用,它是系统及服务,可以进行定时操作而不依赖于 Acitivity 或 Service,但是 Android 在不同的 API 级别中有...
  • Zackratos
  • Zackratos
  • 2016年11月20日 19:39
  • 1152

Android AlarmManager设置定时事件提醒

最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有一个起作用,百思不得其解,后来在网上找到了原因,把人家的解决办法贴上: AlarmManager的常用方法有三个: (1...
  • zhangke3016
  • zhangke3016
  • 2015年10月09日 13:30
  • 1676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中AlarmManager的几个重要方法详解
举报原因:
原因补充:

(最多只允许输入30个字)