AlarmManager

摘要:
AlarmManager主要管理硬件时钟。一些与时间相关的应用程序,如日历和闹钟,需要使用AlarmManager服务。Alarmmanager的功能相对简单。相关代码位于frames/base/core/jni/server/com_android_server_AlarmManagerService.cppframeworks/base/services/java/com/android/server/AlarmManagerService中。java I.frames/base/core/jni/server/com_android_server_AlarmManagerService。cpp代码直接管理硬件时钟。设备名称为/dev/alarm。AlarmManager将应用程序与服务分离后,应用程序开发人员不关心特定服务,而是通过AlarmManager直接使用此服务。AlarmManager和AlarmManagerServie通过Binder进行通信,它们具有多对一的关系。在Android系统中,AlarmManage提供三个接口和五种类型的报警服务。

AlarmManager 主要管理硬件时钟。

一些与时间相关的应用,如日历,闹钟等需要使用Alarm Manager的服务。Alarm manager功能相对比较简单,相关代码位于
frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
frameworks/base/services/java/com/android/server/AlarmManagerService.java

一. frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
这部分代码直接管理硬件时钟,设备名为/dev/alarm。包括打开设备,关闭设备,设置时区,设置触发时间(timeout),以及等待时钟触发。
二. frameworks/base/services/java/com/android/server/AlarmManagerService.java
这部分封装目录一中的代码,向上提供java接口,同时与客户端(如calendar)交互,接收来自客户端的时钟设置请求,并在时钟触发时通知客户端。

AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。

在android系统中,AlarmManage提供了3个接口5种类型的闹铃服务。

3个接口:

1、 取消已经注册的与参数匹配的闹铃    

void    cancel(PendingIntent operation)  

2、注册一个新的闹铃   

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

3、注册一个重复类型的闹铃   

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

4、设置时区   

void    setTimeZone(String timeZone)  

 

5个闹铃类型:

1、public   static   final   int  ELAPSED_REALTIME  

        // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用                            SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。

2、public   static   final   int  ELAPSED_REALTIME_WAKEUP  

      //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。   

3、  public   static   final   int  RTC  

        //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。

    系统值是1 (0x00000001) 。   

4、public   static   final   int  RTC_WAKEUP  

        //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。   

5、Public static   final   int  POWER_OFF_WAKEUP  

        //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。

   

注意一个重要的参数PendingIntent。这个PendingIntent可以说是 Intent的进一步封装,他既包含了Intent的描述又是Intent行为的执行(这种定义也许不太严格),如果将Intent比作成一个订单的 话,PendingIntent更像是一个下订单的人,因为它既要负责将订单发出去,也要负责订单发送后的处理,比如发送成功后要准备验收订单货物,发送 失败后要重发还是取消订单等操作。开发者可以通过调用getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

三种不同方式来得到一个PendingIntent实例。

getBroadcast——通过该函数获得的PendingIntent将会 扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让系统自动找到该行为处理对象。

举个例子,你可以使用Alarm来实现一个闹钟程序,执行正常的网络查询,或者在“非高峰”时间安排耗时或有代价的操作。

对于仅在应用程序生命周期内发生的定时操作,Handler类与Timer和Thread类的结合是一个更好的选择,它允许Android更好地控制系统资源。

Android中的Alarm在设备处于睡眠模式时仍保持活跃,它可以设置来唤醒设备;然而,所有的Alarm在设备重启时都会被取消。

Alarm的操作通过AlarmManager来处理,通过getSystemService可以获得其系统服务,如下所示:

AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

为了创建一个新的Alarm,使用set方法并指定一个Alarm类型、触发时间和在Alarm触发时要调用的Intent。如果你设定的Alarm发生在过去,那么,它将立即触发。

可以使用上述5种Alarm类型。

Alarm的创建过程演示如下片段所示:

int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;

long timeOrLengthofWait = 10000;

String ALARM_ACTION = “ALARM_ACTION”;

Intent intentToFire = new Intent(ALARM_ACTION);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);

alarms.set(alarmType, timeOrLengthofWait, pendingIntent);

当Alarm到达时,你指定的PendingIntent将被触发。设置另外一个Alarm并使用相同的PendingIntent来替代之前存在的Alarm。

取消一个Alarm,调用AlarmManager的cancel方法,传入你不再希望被触发的PendingIntent,如下面的代码所示:

alarms.cancel(pendingIntent);

接下来的代码片段中,设置了两个Alarm,随后马上取消了第一个Alarm。第一个Alarm显式地设置了在特定的时间唤醒设备并发送Intent。

第二个设置为从设备启动后,流逝时间为30分钟,到达时间后如果设备在睡眠状态也不会唤醒它。

AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

String MY_RTC_ALARM = “MY_RTC_ALARM”;

String ALARM_ACTION = “MY_ELAPSED_ALARM”;

PendingIntent rtcIntent = PendingIntent.getBroadcast(this, 0, new Intent(MY_RTC_ALARM), 1);

PendingIntent elapsedIntent = PendingIntent.getBroadcast(this, 0, new Intent(ALARM_ACTION), 1);

// Wakeup and fire intent in 5 hours.(注释可能有错)

Date t = new Date();

t.setTime(java.lang.System.currentTimeMillis() + 60*1000*5);

alarms.set(AlarmManager.RTC_WAKEUP, t.getTime(), rtcIntent);

// Fire intent in 30 mins if already awake.

alarms.set(AlarmManager.ELAPSED_REALTIME, 30*60*1000, elapsedIntent);

// Cancel the first alarm.

alarms.cancel(rtcIntent);

免责声明:文章转载自《AlarmManager》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql-5.6.27源码安装及错误解决办法测试开发中的虫剂悖论下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 蓝牙开发(1)

普通蓝牙设备官方文档 Android 平台包含蓝牙网络堆栈支持,凭借此支持,设备能以无线方式与其他蓝牙设备交换数据。应用框架提供了通过 Android Bluetooth API 访问蓝牙功能的途径。使用 Bluetooth API Android 应用可以执行下面的操作: 扫描其他蓝牙设备 查询本地蓝牙适配器的配对蓝牙设备 建立 RFCOMM 通道...

【Android实验】组件通信Intent

实验目的 目录 实验目的 实验要求 实验结果 实验代码 father.xml:主界面文件 content_child.xml:子界面 Fourth.java: 处理文件 ChildActivity.java: 子界面处理文件 实验总结 了解使用Intent进行组件通信原理 掌握使用Intent启动Activity的方法 熟悉和掌握A...

unity 游戏第一次安装完之后运行,切出来,点击桌面图标后黑屏问题

unity 游戏第一次安装完之后运行,切出来,点击桌面图标后黑屏问题 这个问题只会在第一次出现,之后就是桌面进入了,不会再出现这个问题了 这是一个解决办法吧: 就是将安装之后运行的游戏杀死,然后在重新进入游戏,  // 在onCreate()最前面添加一下代码 if (!isTaskRoot()) { final Intent intent = g...

Android02——Activity

Activity 目录 Activity 创建空白activity和layout 创建活动 设置布局 在活动中加载布局 AndroidManfiest文件中注册 在活动中使用toast Menu 销毁一个活动 Intent 显式intent 隐式intent 其他intent用法 向下一个活动传递数据 返回数据给上一个活动[没懂] ac...

Android二维码功能实现

最近二维码真是越来越火了,随便电视上、网络上、商场里,到处都是二维码。而内嵌二维码扫描功能的软件也越来越多,QQ、微信、UC浏览器等等应用都可以对着二维码扫一扫,感觉我们自己的应用里不加上二维码扫描功能,都跟不上时代潮流了。所以今天我就将带着大家一起,在我们自己的程序里加入二维码扫描的功能。 不过,二维码功能如果真要做起来还是非常复杂的,从零开始实现不太现...

Kotlin实践记录

kotlin中is来判断一个对象与指定的类型是否一致: var a: Any = "a" if(a is String) { println("a是String类型") } if (a !is Int) { println("a不是Int类型") } Kotlin相等判断: equals()或 ==:判断两个结构是否相等 var a = "...