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. Azure Linux VM Swap 分区

    默认情况下,Windows Azure上的Linux VM是没有Swap分区的.下面我们以Ubuntu为例,为Windows Azure上的Linux虚拟机创建Swap分区. Windows Azur ...

  2. nodejs入门

    一.Nodejs介绍 简单的说 Node.js 就是运行在服务端的 JavaScript的代码解析器. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情.它无法像Apache ...

  3. [转]ASP.NET 成员资格 Part.1(API)

    本文转自:http://www.cnblogs.com/SkySoot/archive/2013/04/08/3008418.html 表单验证解决了 ASP.NET 应用程序页面验证的问题,但另一方 ...

  4. MMORGP大型游戏设计与开发(客户端架构 part1 of vgui)

    作为客户端的重要装饰,UI扮演着极为重要的角色,是客户端中核心的组成.vgui(微GUI)中,提供了核心的接口封装,实现了客户端中常见的界面操作,并结合lua脚本,使得控制界面更加的方便. 构架 总结 ...

  5. OpenStack Networking overview

    原文地址:http://docs.openstack.org/newton/install-guide-ubuntu/neutron-concepts.html Networking service ...

  6. 怎么解决ZBrush保存历史记录太多问题

    经常有用户反映说ZBrush ®保存历史记录太多了,导致文件太大了!模型已经是降低级别保存了,在保存历史记录的时候还是很慢很慢,不知道怎么才能减少ZBrush保存的历史步骤的多少.针对这一问题,小编统 ...

  7. Zookeeper 监视(Watches) 简介(转)

    Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量.结构体声明也在 zookeeper.h 中,如果 ...

  8. Android中事件传递机制的总结

    事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处 ...

  9. BC#86 1003NanoApe Loves Sequence Ⅱ[two-pointer]

    NanoApe Loves Sequence Ⅱ  Accepts: 374  Submissions: 946  Time Limit: 4000/2000 MS (Java/Others)  Me ...

  10. 06章 Struts2国际化

    1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...