Android闹钟 AlarmManager的使用

AlarmManager介绍

AlarmManager这个类提供对系统闹钟服务的访问接口。

你可以为你的应用设定一个在未来某个时间唤醒的功能。

当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用。

注册的闹钟在设备睡眠的时候仍然会保留,可以选择性地设置是否唤醒设备,但是当设备关机和重启后,闹钟将会被清除。

在alarm的receiver的onReceive()方法被执行的时候,Alarm Manager持有一个CPU唤醒锁,这样就保证了设备在处理完广播之前不会sleep。

一旦onReceive()方法返回,Alarm Manager就会释放这个锁,表明一些情况下可能onReceive()方法一执行完设备就会sleep。

如果你的alarm receiver中调用了Context.startService(),那么很可能service还没起来设备就sleep了。

为了阻止这种情况,你的BroadcastReceiver和Service需要实现不同的唤醒锁机制,来确保设备持续运行到service可用为止。

注意:Alarm Manager主要是用来在特定时刻运行你的代码,即便是你的应用在那个特定时刻没有跑的情况。

对于常规的计时操作(ticks, timeouts, etc),使用Handler处理更加方便和有效率。

另:从API 19开始,alarm的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。

targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。

闹钟Demo

Android Api demos中就有关于闹钟使用的Demo:

com.example.android.apis.app.AlarmController

其中设定了两种闹钟,一种是一次性的,一种是重复的。

Manifest中的声明,process属性

自定义的receiver,在manifest中声明如下:

Demo中两个Receiver的onReceive方法中显示了各自的Toast提示,所以不再列出。

在此讨论一下process属性,它规定了组件(activity, service, receiver等)所在的进程。

通常情况下,没有指定这个属性,一个应用所有的组件都运行在应用的默认进程中,进程的名字和应用的包名一致。

比如manifest的package="com.example.helloalarm",则默认进程名就是com.example.helloalarm。

元素的process属性可以为全部的组件设置一个不同的默认进程。

组件可以override这个默认的进程设置,这样你的应用就可以是多进程的。

如果你的process属性以一个冒号开头,进程名会在原来的进程名之后附加冒号之后的字符串作为新的进程名。当组件需要时,会自动创建这个进程。这个进程是应用私有的进程。

如果process属性以小写字母开头,将会直接以属性中的这个名字作为进程名,这是一个全局进程,这样的进程可以被多个不同应用中的组件共享。

一次性闹钟

//When the alarm goes off, we want to broadcast an Intent to our//BroadcastReceiver. Here we make an Intent with an explicit class//name to have our own receiver (which has been published in//AndroidManifest.xml) instantiated and called, and then create an//IntentSender to have the intent executed as a broadcast.

Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);

PendingIntent sender=PendingIntent.getBroadcast(

AlarmController.this, 0, intent, 0);//We want the alarm to go off 10 seconds from now.

Calendar calendar =Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMillis());

calendar.add(Calendar.SECOND,10);//Schedule the alarm!

AlarmManager am =(AlarmManager) getSystemService(ALARM_SERVICE);

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

重复闹钟

闹钟设置:

//When the alarm goes off, we want to broadcast an Intent to our//BroadcastReceiver. Here we make an Intent with an explicit class//name to have our own receiver (which has been published in//AndroidManifest.xml) instantiated and called, and then create an//IntentSender to have the intent executed as a broadcast.//Note that unlike above, this IntentSender is configured to//allow itself to be sent multiple times.

Intent intent = new Intent(AlarmController.this,

RepeatingAlarm.class);

PendingIntent sender=PendingIntent.getBroadcast(

AlarmController.this, 0, intent, 0);//We want the alarm to go off 10 seconds from now.

Calendar calendar =Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMillis());

calendar.add(Calendar.SECOND,10);//Schedule the alarm!

AlarmManager am =(AlarmManager) getSystemService(ALARM_SERVICE);

am.setRepeating(AlarmManager.RTC_WAKEUP,

calendar.getTimeInMillis(),10 * 1000, sender);

闹钟取消:

//Create the same intent, and thus a matching IntentSender, for//the one that was scheduled.

Intent intent = new Intent(AlarmController.this,

RepeatingAlarm.class);

PendingIntent sender=PendingIntent.getBroadcast(

AlarmController.this, 0, intent, 0);//And cancel the alarm.

AlarmManager am =(AlarmManager) getSystemService(ALARM_SERVICE);

am.cancel(sender);

AlarmManager说明

AlarmManager这个类提供对系统闹钟服务的访问接口。

对它的获取是通过系统服务:

相关方法说明:

关于Intent的匹配,查看filterEquals(Intent other)方法的说明可知,两个Intent从intent resolution(filtering)(Intent决议或过滤)的角度来看是一致的,即认为两个Intent相等。即是说,Intent的action,data,type,class,categories是相同的,其他的数据都不在比较范围之内。

set(int type, long triggerAtMillis, PendingIntent operation)方法将会设置一个闹钟。

注意:对于计时操作,可能使用Handler更加有效率和简单。

设置闹钟的时候注意:

1.如果声明的triggerAtMillis是一个过去的时间,闹钟将会立即被触发。

2.如果已经有一个相同intent的闹钟被设置过了,那么前一个闹钟将会取消,被新设置的闹钟所代替。

注意这里说的intent相同指的都是Intent在 filterEquals(Intent)的定义下匹配。

闹钟是一个广播,接收器需要自己定义和注册,注册使用动态注册( registerReceiver(BroadcastReceiver, IntentFilter) )或者静态注册( tag in an AndroidManifest.xml file)都可以。

setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)方法将会设置一个重复性的闹钟。

比set方法多了一个间隔参数。

type的类型是四种:

区分的是时间标准和是否在睡眠状态下唤醒设备。

具体查看官方文档吧不再详细解释啦。

实例

比如要设置一个每晚21:30唤醒的重复闹钟:

private static final int INTERVAL = 1000 * 60 * 60 * 24;//24h//...

Intent intent= new Intent(context, RequestAlarmReceiver.class);

PendingIntent sender=PendingIntent.getBroadcast(context,

REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);//Schedule the alarm!

AlarmManager am =(AlarmManager) context

.getSystemService(Context.ALARM_SERVICE);

Calendar calendar=Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY,21);

calendar.set(Calendar.MINUTE,30);

calendar.set(Calendar.SECOND,10);

calendar.set(Calendar.MILLISECOND,0);

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),

INTERVAL, sender);

参考资料

AlarmManager:

闹钟Demo解析:

android 设备关机后还能在设定的闹钟时刻响起的功能如何实现,Android闹钟 AlarmManager的使用...相关推荐

  1. 手机关机后还会有行程记录吗

    不少用户听说手机会定位自己所在的位置,为了更加安全,有时会选择关机,那么手机关机后还会有行程记录吗,下面与大家分享下手机关机还会记录行程吗的教程. 手机定位原理是利用基站对手机距离的测算来确定手机的位 ...

  2. american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...

    经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...

  3. 主板网卡灯关机后还亮_achair的电脑桌面2019 第2集 (机箱风道,Intel无线网卡……)...

    大家好,这集说说台式机. 电脑机箱是2018年新购入的,FD分形工艺品牌的,小机箱,我很满意,唯一缺点是我安装的风扇比较多,安静环境时有点吵,两个14CM风扇进风,两个12CM风扇出风,分别是后和后上 ...

  4. american主板网卡灯关机后还亮_安装黑苹果出问题,安装到最后一分钟黑屏,硬盘灯灭了后重启进苹果系统卡死,有图。...

    2012-9-24 00:43 上传 下载附件 (169.1 KB) 主板设置: 开启SATA的AHCI模式.在BIOS中将主板的集显关闭.预设显示设备选为"PEG" 上图 在BI ...

  5. american主板网卡灯关机后还亮_七彩虹主板设置概述.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp计算机硬件与维护 七彩虹主板设置概述.pdf64页 本文档一共被 ...

  6. american主板网卡灯关机后还亮_玩游戏电脑自己关机。主机灯一闪一闪的。显示器黑屏。键盘鼠标不亮。切短电源才不亮、求大神帮忙看看、、...

    电脑概览 电脑型号  MSI MS-7721 操作系统  Microsoft Windows 8.1 专业版 (64位) CPU  AMD Athlon(tm) X4 740 Quad Core Pr ...

  7. 在计算机中关闭应用程序,电脑中如何取消点击关机后出现的还需要关闭程序的提示...

    ‍ 相信有很多用户都有遇到过在电脑中点击关机后,出现一个还需要关闭程序的提示,有时候还需要用户手动点击强制关闭的按钮才能进行关闭电脑系统的操作.不少用户觉得这个操作很多余,因此,可以按照下面的方法来取 ...

  8. 基于蓝牙与Android设备的控制系统设计

    Android操作系统是Google基于开源的Linux操作系统开发的移动操作平台,由操作系统.中间件.用户界面和应用软件组成,是专门为移动终端打造的开放和完整的移动操作系统.Android软件平台包 ...

  9. jsb调用java_cocos2d-js | JSB 调用Java函数 | Android设备ID

    引擎版本:cocos2d-x-3.13 语言:cocos2d-js 几乎所有的游戏项目都有获取玩家设备ID的需求,这里记录一下使用cocos2d-js时的Android设备获取方式. 用JS获取And ...

最新文章

  1. java 网络实验_Java实验五网络编程与安全
  2. python input与返回值-python中使用input()函数获取用户输入值方式
  3. lzw编码过程详解_编码拓展——封装、编码、码率
  4. day14 集合与函数
  5. 为什么1900年不是闰年
  6. 小度智能音箱维修点_小度智能音箱APP下载
  7. Oracle 获取本周、本月、本季、本年的第一天和最后一天
  8. 【转】VS2005 CTP 版本这个CTP是什么意思
  9. Linux之Json20160705
  10. (pytorch-深度学习系列)CNN二维卷积层-学习笔记
  11. java 重定向关键字_SpringMVC 转发、重定向
  12. 过滤代码中的html标签
  13. 卷积神经网络 第三周作业 Keras+-+Tutorial+-+Happy+House+v1
  14. wince车机刷系统刷机包_刷机ROM大全,你刷过几个OS系统
  15. 为什么32.768kHz的晶振封装这么另类?
  16. c语言注释部分两侧的分界符号分别是,单片机C语言练习题
  17. model.compile
  18. 数论 —— 逆元与同余式定理
  19. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码
  20. 窑尾烟室气体分析仪常见故障及处理

热门文章

  1. 推荐一款快速集成 4399 原创平台的 SDK 插件
  2. OpenLayer示例网址汇总
  3. 看看牛人们都再用什么软件
  4. Python判断是否构成三角形,求三角形面积
  5. TopoJSON数据转换
  6. 朝阳群众盯上了望京A座,举报996造成交通严重堵塞。996将成历史?
  7. 英语四级万能写作模板
  8. 删除HP打印机驱动程序 打印机驱动程序正在使用无法删除
  9. c语言大小写字母相互转化,字母大小写互相转换 ASCII码转化符号问题
  10. Preservational Learning Improves Self-supervised Medical Image Models by Reconstructing Diverse Cont