AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,它的作用和Timer有点相似。
都有两种相似的用法:
(1)在指定时长后执行某项操作

(2)周期性的执行某项操作

在android系统中,底层系统提供了两种类型的时钟,软时钟与硬时钟,软时钟就是我们常说的 Timer,硬时钟就是RTC。系统在正常运行的情况下,Timer工作提供时间服务和闹铃提醒,而在系统进入睡眠状态后,时间服务和闹铃提醒由RTC来 负责。对于上层应用来说,我们并不需要关心是 timer还是RTC为我们提供服务,因为android系统的Framework层把底层细节做了封装并统一提供API。这个API他的名字就叫 AlarmManager。在android系统中有意思的是对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序 才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在android系统中,linux实现的设备名为 "/dev/alarm"),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表 找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在Java层的AlarmManagerService与Linux Alarm驱动 程序接口之间还有一层封装,那就是JNI。
       AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也 许就是客户/服务模式的好处吧。AlarmManager与AlarmManagerServie之间是通过Binder来通信 的,他们之间是多对一的关系。在android系统中,AlarmManage 提供了3个接口5种类型的闹铃服务:

3个API调用接口:

Java代码:

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

复制代码

5种闹铃类型:

Java代码:

  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)。*/

复制代码

下面写一个闹钟的例子

主窗体,按钮弹出一个日历控件,以便设置闹钟的时间

  1. public class AlarmTest extends Activity
  2. {
  3. Button setTime;
  4. AlarmManager aManager;
  5. Calendar currentTime = Calendar.getInstance();
  6. @Override
  7. public void onCreate(Bundle savedInstanceState)
  8. {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. // 获取程序界面的按钮
  12. setTime = (Button) findViewById(R.id.setTime);
  13. // 获取AlarmManager对象
  14. aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
  15. //为“设置闹铃”按钮绑定监听器。
  16. setTime.setOnClickListener(new OnClickListener()
  17. {
  18. @Override
  19. public void onClick(View source)
  20. {
  21. Calendar currentTime = Calendar.getInstance();
  22. // 创建一个TimePickerDialog实例,并把它显示出来。
  23. new TimePickerDialog(AlarmTest.this,
  24. 0, // 绑定监听器
  25. new TimePickerDialog.OnTimeSetListener()
  26. {
  27. @Override
  28. public void onTimeSet(TimePicker tp, int hourOfDay,
  29. int minute)
  30. {
  31. // 指定启动AlarmActivity组件
  32. Intent intent = new Intent(AlarmTest.this
  33. , AlarmActivity.class);
  34. // 创建PendingIntent对象
  35. PendingIntent pi = PendingIntent.getActivity(
  36. AlarmTest.this, 0, intent, 0);
  37. Calendar c = Calendar.getInstance();
  38. c.setTimeInMillis(System.currentTimeMillis());
  39. // 根据用户选择时间来设置Calendar对象
  40. c.set(Calendar.HOUR , hourOfDay);
  41. c.set(Calendar.MINUTE , minute);
  42. // 设置AlarmManager将在Calendar对应的时间启动指定组件
  43. aManager.set(AlarmManager.RTC_WAKEUP
  44. , c.getTimeInMillis(), pi);
  45. // 显示闹铃设置成功的提示信息
  46. Toast.makeText(AlarmTest.this ,
  47. "闹铃设置成功啦" , 5000).show();
  48. }
  49. }, currentTime.get(Calendar.HOUR_OF_DAY)
  50. , currentTime.get(Calendar.MINUTE), false)
  51. .show();
  52. }
  53. });
  54. }
  55. }

设置时间到以后,弹出的小窗体,以播放音乐

  1. public class AlarmActivity extends Activity
  2. {
  3. MediaPlayer alarmMusic;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. // 加载指定音乐,并为之创建MediaPlayer对象
  9. alarmMusic = MediaPlayer.create(this, R.raw.alarm);
  10. alarmMusic.setLooping(true);
  11. // 播放音乐
  12. alarmMusic.start();
  13. // 创建一个对话框
  14. new AlertDialog.Builder(AlarmActivity.this)
  15. .setTitle("闹钟")
  16. .setMessage("闹钟响了,Go!Go!Go!")
  17. .setPositiveButton(
  18. "确定" ,
  19. new OnClickListener()
  20. {
  21. @Override
  22. public void onClick(DialogInterface dialog , int which)
  23. {
  24. // 停止音乐
  25. alarmMusic.stop();
  26. // 结束该Activity
  27. AlarmActivity.this.finish();
  28. }
  29. }
  30. )
  31. .show();
  32. }
  33. }

最后不要忘了把两个Activity加入到AndroidManifest.xml中

alarm的更多相关文章

  1. rtc关机闹钟2 Alarm manager

    public void set(int type, long triggerAtMillis, long windowMillis, long intervalMillis, PendingInten ...

  2. setup notifier actions in aodh alarm

    Aodh alarm NOTIFIER ==> alarm_actions URL: http://<host>/<action> NOTIFIER will resol ...

  3. Best Practices for Background Jobs_3 Managing Device Awake State之电源锁、Alarm、WakefulBroadcastReceiver

    http://developer.android.com/training/scheduling/index.html 当静置一个设备的时候,先会屏幕变暗,然后关闭屏幕,最后关闭CPU,以省电.但有的 ...

  4. Linux 信号详解四(pause,alarm)

    pause函数 --将进程置为可中断睡眠状态,然后它调用内核函数schedule(),使linux进程调度器找到另一个进程来运行. --pause使调用者进程挂起,知道一个信号被捕获. alarm函数 ...

  5. 例子:Alarm Clock with voice Commands Sample

    通过本例子学习: 如何使用自定义字体文件(.TTF) 如何播放声音 动画的使用 Speech 设置闹铃 应用 设置 数据存储到IsolatedStorage 如何使用自定义字体文件(.TTF) < ...

  6. alarm rtc

    http://sharp2wing.iteye.com/blog/1329518 http://blog.csdn.net/sking002007/article/details/6593809 io ...

  7. linux alarm函数解除read write等函数的阻塞

    看到apue的第十章,说到alarm,pause可以实现sleep,可以让某些一直阻塞的函数超时,例如read,write.代码如下: static void sig_alrm(int signo) ...

  8. Alarm(硬件时钟) init

    http://blog.csdn.net/angle_birds/article/details/17302297 Alarm就是一个硬件时钟,前面我们已经知道它提供了一个定时器,用于把设备从睡眠状态 ...

  9. 第十一章 Android 内核驱动——Alarm

    11.1  基本原理 Alarm 闹钟是 android 系统中在标准 RTC 驱动上开发的一个新的驱动,提供了一个定时器 用于把设备从睡眠状态唤醒,当然因为它是依赖 RTC 驱动的,所以它同时还可以 ...

随机推荐

  1. 瘟疫公司中国版(Android)手动破解内购

    前言 洒家近日下载了个瘟疫公司中国版(安卓版)(com.easymobi.plagueinc.mi ,版本 1.1.2(5)(.mi 小米版)),发现游戏需要内购而且价格不菲. 需求 root权限 文 ...

  2. Tomcat免安装配置

    大家都知道tomcat吧!因为Tomcat 技术先进.性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器,也是运行Servlet和JS ...

  3. ssh 无密码登录 非相同用户

    场景,机器A 用户a,想登录机器B ,机器B上没有用户a,有用户b. 已知机器B的用户密码,可以这么做. 实验:两台机器都是linux centos的系统. 在机器A上生成a用户的密钥. ssh-ke ...

  4. spring mvc参数绑定

    spring绑定参数的过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接 ...

  5. C#中Abstract和Virtual

    C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...

  6. JIRA学习一:Windows下安装破解JIRA6.3.6

    安装环境: WindowsXP MySQL-5.5.28 JDK1.6.0_21 JIRA功能全面,界面友好,安装简单,配置灵活,权限管理以及可扩展性方面都十分出色. 一.MySQL建库和建账号 1. ...

  7. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统

    busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...

  8. Android驱动入门-LED--HAL硬件抽象层程序设计①

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21  16:15:26 设计HAL硬件抽象层程序,则需要 ...

  9. jprofiler安装图解

    环境: 1.sun jdk1.6.0 2.jprofiler_windows_6_0_2.exe 安装 1. jdk, 安装略... 2. jprofiler安装 一路next 到Enter lice ...

  10. 实现了与maya场交互的能力

    今天把模拟节点与maya场的对接做好了,效果如图: 图中黄色线为每个节点受到的外力,由于加了一个重力场,所以外力都是竖直向下. 节点连线方式如图所示: 交互的具体方法是在每次模拟之前,更新每个节点所受 ...