深入学习android之AlarmManager

对应AlarmManage有一个AlarmManagerServie服务程 序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名 为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列 表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间还有一层封装,那就是JNI。

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

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

3个接口:

view plain copy to clipboard print ?

  1. // 取消已经注册的与参数匹配的闹铃
  2. void    cancel(PendingIntent operation)
  3. //注册一个新的闹铃
  4. void    set( int  type,  long  triggerAtTime, PendingIntent operation)
  5. //注册一个重复类型的闹铃
  6. void    setRepeating( int  type,  long  triggerAtTime,  long  interval, PendingIntent operation)
  7. //设置时区
  8. void    setTimeZone(String timeZone)

Java代码

  1. // 取消已经注册的与参数匹配的闹铃
  2. void   cancel(PendingIntent operation)
  3. //注册一个新的闹铃
  4. void   set(int type, long triggerAtTime, PendingIntent operation)
  5. //注册一个重复类型的闹铃
  6. void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
  7. //设置时区
  8. void   setTimeZone(String timeZone)

5个闹铃类型

view plain copy to clipboard print ?

  1. public   static   final   int  ELAPSED_REALTIME
  2. // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。
  3. public   static   final   int  ELAPSED_REALTIME_WAKEUP
  4. //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
  5. public   static   final   int  RTC
  6. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
  7. public   static   final   int  RTC_WAKEUP
  8. //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
  9. Public static   final   int  POWER_OFF_WAKEUP
  10. //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。

Java代码

  1. public
  2. static final int ELAPSED_REALTIME
  3. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠
  4. 时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。
  5. public static final int ELAPSED_REALTIME_WAKEUP
  6. //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
  7. public static final int RTC
  8. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用
  9. System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
  10. public static final int RTC_WAKEUP
  11. //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
  12. Public static final int POWER_OFF_WAKEUP
  13. //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为
  14. 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等描述让系统自动找到该行为处理对象。

view plain copy to clipboard print ?

  1. Intent intent =  new  Intent(AlarmController. this , OneShotAlarm. class );
  2. PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this ,  0 , intent,  0 );

Java代码

  1. Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
  2. PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);

getActivity——通过该函数获得的PendingIntent可以直 接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.

view plain copy to clipboard print ?

  1. // The PendingIntent to launch our activity if the user selects this notification
  2. PendingIntent contentIntent = PendingIntent.getActivity(this ,  0 ,   new  Intent( this , AlarmService. class ),  0 );

Java代码

  1. // The PendingIntent to launch our activity if the user selects this notification
  2. PendingIntent contentIntent = PendingIntent.getActivity(this, 0,  new Intent(this, AlarmService.class), 0);

getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。

view plain copy to clipboard print ?

  1. // Create an IntentSender that will launch our service, to be scheduled
  2. // with the alarm manager.
  3. mAlarmSender = PendingIntent.getService(AlarmService.this ,
  4. 0 ,  new  Intent(AlarmService. this , AlarmService_Service. class ),  0 );
时间: 2024-07-29 20:26:44

深入学习android之AlarmManager的相关文章

一培训机构设计的学习android课程内容:供大家参考

转自:http://www.cnblogs.com/csj007523/archive/2011/06/16/2082682.html 第一阶段:Linux操作系统及C语言编程 课程目标:熟练Linux操作系统.熟练C语言编程 模块名称 阶段目标 Ubuntu安装与配置 掌握Ubuntu的安装与配置 Linux 基本命令讲解 熟练Linux系统的常用命令,并能使用其操作该系统 Linux下的C编程环境配置 学习Linux下C编程环境的配置和应用 C基础入门 C基础入门,熟练基本语法,程序基础 函

问题:android学习内容破碎,我个人关于如何学习android的一些个人经历

android学习两个月心得 我于大三下学期,开始准备学习android,在寒假期间,学了毕向东的java视频的前10天,觉得还不错,上网找评论,他们都说,只要学到多线程就可以学习android了, 开学我就开始了android的学习,做了一些简单的UI,实现了几个简单Activity的信息传递和跳转.但是在学习的过程中我发现(到目前为止,大概两个月),android的知识点就像是一片又一片的花瓣,你可以任意挑选这去学习,没有一个权威的方向. 各种视频教程,图书,包括android的官方开发文档

学习Android之初。

今天开始,要正式系统的学习Android了.我想要看清未来的路.so,我查了很多,这篇博客很对胃口,写的很具体,一目了然.以至于可以预知之后的路. Thanks.从今天开始,也要付出努力了.当下把Android学好,以后工作后学习,前端和服务器端,以及html5和Hadoop.我爱编程,它将伴我一生. 大道三千,何以证道? 最近有私信.邮件给我咨询一些职业生涯规划的同学,我在这里以过来人的身份给大家一些建议. 任何行业,任何职位,无论高低,无论大小,都可以分为广博.精深两个方向. 精深自然指的是

C#程序员学习Android开发系列之ListView

上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如何在ListView中按照我们想要的界面效果进行展示.限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite. ListView是一个常用的数据显示控件,假设我们要做一个简单的界面,如图所示. 这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通

学习Android之SharedPreferences使用

效果图如下: 当我们想让自己的属性设置保存下来,这时就需要SharedPreferences. 上面这个小程序,音乐状态是保存下来的.使用的上一次退出的状态. 进入DDMS,data文件下的data文件中,找到自己的包名文件,双击打开,有shared_prefs文件,里面有xml文件,这就是配置文件. 本程序使用了android的上下键,同常我们的模拟器的方向键是不能用的,这是就需要我们打开它,在C盘下找到文件 .android,双击avd文件,找到你的模拟器的文件夹,双击打开,找到config

学习Android之SimpleAdapter显示网络图片

效果图: 此程序主要的知识点是:SimpleAdapter本身是不支持网络图片的, 如果在Map.put(a,b)中 b为一个Bitmap,程序不会报红色字体,而是在控制台输出绿色的字体,如下 05-10 15:46:45.474: I/System.out(846): resolveUri failed on bad bitmap uri: [email protected] 要想实现显示网络图片其实很简单,使用SimpleAdapter中的方法simpleAdapter.setViewBin

我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸

该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸. setResource(int resid)将壁纸设置为resid资源所代表的图片 setBitmap(Bitmap bitmap)将壁纸设置为bitmap所代表的位图 setStream(InputStream data)将壁纸设置为d

C#程序员学习Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明确一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的,由于我比较擅长C#,所以对Java语言本身不太熟练,需要加强Java语言基础的练习,这一块我会穿插到具体的知识点练习当中,并且在必要的地方给出与C#语言的对比(其实基本上在语法层

学习Android之第八个小程序文件保存(Notification、AndroidTestCase)

效果图:       .java文件有MainActivity.java.FileService.java.FileServiceTest.java, .xml文件有activity_main.xml. 本次注重AndroidTestCase类的使用,在开发中非常实用.用于测试某一功能. 使用AndroidTestCase类,有如下的要求: 1.在AndroidManifest.xml文件中,<manifest></manifest>中添加如下: <instrumentati