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. redis参数优化

    redis内存管理方式,支持tcmalloc,jemalloc,malloc三种内存分配,memcache使用slabs,malloc等内存分配方式. 简单点,就是redis,是边用边申请,使用现场申 ...

  2. 准备使用 Office 365 中国版--邮箱迁移

    微软产品一贯的作风是从来不缺文档和教程,Office 365也不例外.无论是最终用户还是企业IT管理员,都可参照Office 365使用指南顺利的开启Office 365之旅.不过比较奇怪的是,貌似很 ...

  3. 淘宝美工一站式:淘宝ps高级美工技巧视频教程,HTML代码学习【教程下载

    视频免费下载地址:http://www.fu83.cn/thread-243-1-1.html

  4. JavaSE复习总结之集合(Collection)

    Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT ...

  5. codevs[1300]文件排版

    Description 写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序. 完成这个任务最简单的办法是在 ...

  6. webpack里的module选项配置

    webpack里的module 有loaders选项和noParse选项,noParse选项配置不需要解析的目录和文件 module:{ loaders:[], noParse: [ path.joi ...

  7. IE兼容forEach/map/every/some/indexOf/filter

    some if (!Array.prototype.some){ Array.prototype.some = function(fun /*, thisArg */) { 'use strict'; ...

  8. Windows系统服务器IIS7.5 Asp.net支持10万请求的设置方法

    问题现象 ECS Windows系统服务器基于IIS搭建的网站由于IIS默认的配置,服务器最多只能处理5000个同时请求,访问量大时很容易导致报错: Error Summary:  HTTP Erro ...

  9. Java8 Lambda表达式和流操作如何让你的代码变慢5倍

    原文出处:ImportNew 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for- ...

  10. 用django实现一个微信图灵机器人

    微信的post请求格式是xml,所以django需要做的就是将xml请求解析出来,把content发送到图灵机器人接口, 接口返回的json数据把主要内容给解析出来,然后重新封装成xml返回给微信客户 ...