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. 地图编辑器V1

    功能:1. 拖放地图元素至地图编辑器中2. 可设置参考图3. 背景图可平铺,中央,左上角等放置4. 地图上的元素可旋转,可删除,可拖动5. 保存地图数据时同时生成XML格式的地图信息 -------- ...

  2. C语言链表中数组实现数据选择排序,升序、降序功能主要难点

    链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了. head存储的是第一个节点的地址,head->next存储的是第二个节点的地址 ...

  3. Hadoop2.6 datanode配置在线更新

    datanode 的配置可以在线更新了,http://blog.cloudera.com/blog/2015/05/new-in-cdh-5-4-how-swapping-of-hdfs-datano ...

  4. 报表性能优化方案之单数据集分页SQL实现层式报表

    1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...

  5. [转]在EntityFramework6中执行SQL语句

    本文转自:http://www.cnblogs.com/wujingtao/p/5412329.html 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有 ...

  6. AC日记——元素查找 codevs 1230

    1230 元素查找  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 给出n个正整数,然后有 ...

  7. SQL各种语句、函数

    1.更改数据库的名称 2.表中有数据的情况下再添加列.删除列 3.在SQLServer 中各种查询语句的使用示例 4.模糊查询的语句 5.排序语句.排序并查前三名的语句 聚合函数:sum,avg,ma ...

  8. BZOJ 1408: [Noi2002]Robot

    1408: [Noi2002]Robot Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 510  Solved: 344[Submit][Status][ ...

  9. React Native 项目运行在 Web 浏览器上面

    React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...

  10. Anterior and posterior commissures

    Source: https://en.wikipedia.org/wiki/Posterior_commissure Figrues archive.