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

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/lyz459/p/2545151.html
Copyright © 2011-2022 走看看