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. mysql 分库分表

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...

  2. 代理模式 vs 装饰模式

    代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的.下面分别讲解代理模式和装饰模式. 1.代理模式 一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理 ...

  3. Stanford机器学习笔记-2.Logistic Regression

    Content: 2 Logistic Regression. 2.1 Classification. 2.2 Hypothesis representation. 2.2.1 Interpretin ...

  4. 2016"百度之星" - 初赛(Astar Round2B)

    Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在 ...

  5. 第8章 用户模式下的线程同步(1)_Interlocked系列函数

    8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...

  6. AC日记——红与黑 codevs 2806

    2806 红与黑  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Description 有一个矩形房间,覆盖正方形瓷 ...

  7. IOS

    网上课程:http://www.zhijieketang.com/ edu.51cto.com 码云:http://git.oschina.net/名字 Gesture:https://www.osc ...

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

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

  9. O(1) 查询gcd

    我们来安利一个黑科技.(其实是Claris安利来的 比如我现在有一坨询问,每次询问两个不超过n的数的gcd. n大概1kw,询问大概300w(怎么输入就不是我的事了,大不了交互库 http://mim ...

  10. 针对苹果最新审核要求为应用兼容IPv6

    在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...