zoukankan      html  css  js  c++  java
  • AlarmManager

    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);

  • 相关阅读:
    ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
    Apache XAMPP Fails to start under Windows XP
    Gridview导出到Excel
    PKU 1511 Invitation Cards (SPFA+邻接表)
    等待队列(二)
    HDU--杭电--1253--胜利大逃亡--广搜
    Java菜鸟学习笔记--Exception篇(一):异常简介
    jquery的DOM操作
    Windows下Postgre SQL数据库通过Slony-I 实现数据库双机同步备份
    POJ 2418 ,ZOJ 1899 Hardwood Species
  • 原文地址:https://www.cnblogs.com/lyz459/p/2545151.html
Copyright © 2011-2022 走看看