Android闹钟 AlarmManager的使用
转自:http://www.cnblogs.com/mengdd/p/3819806.html
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的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。
有一些新的API会支持严格准确的传递,见 setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。
targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。
闹钟Demo
Android Api demos中就有关于闹钟使用的Demo:
com.example.android.apis.app.AlarmController
其中设定了两种闹钟,一种是一次性的,一种是重复的。
Manifest中的声明,process属性
自定义的receiver,在manifest中声明如下:
<receiverandroid:name=".OneShotAlarm"android:process=":remote" /><receiverandroid:name=".RepeatingAlarm"android:process=":remote" />
Demo中两个Receiver的onReceive方法中显示了各自的Toast提示,所以不再列出。
在此讨论一下process属性,它规定了组件(activity, service, receiver等)所在的进程。
通常情况下,没有指定这个属性,一个应用所有的组件都运行在应用的默认进程中,进程的名字和应用的包名一致。
比如manifest的package="com.example.helloalarm",则默认进程名就是com.example.helloalarm。
<application>元素的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这个类提供对系统闹钟服务的访问接口。
对它的获取是通过系统服务:
Context.getSystemService(Context.ALARM_SERVICE)。
相关方法说明:
cancel(PendingIntent operation)方法将会取消Intent匹配的任何闹钟。
关于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) )或者静态注册(<receiver> tag in an AndroidManifest.xml file)都可以。
setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)方法将会设置一个重复性的闹钟。
比set方法多了一个间隔参数。
type的类型是四种:
ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP.
区分的是时间标准和是否在睡眠状态下唤醒设备。
具体查看官方文档吧不再详细解释啦。
实例
比如要设置一个每晚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:
http://developer.android.com/reference/android/app/AlarmManager.html
闹钟Demo解析:
http://blog.csdn.net/mapdigit/article/details/7644134
Android闹钟 AlarmManager的使用相关推荐
- android 设备关机后还能在设定的闹钟时刻响起的功能如何实现,Android闹钟 AlarmManager的使用...
Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...
- android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例
1.AlarmManager,顾名思义,就是"提醒",是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的PendingIntent.通俗点,就是设置一 ...
- Android,AlarmManager设置多个闹钟相关问题
Android利用AlarmManager来实现多个闹钟功能,其实很简单,网上有很多关于AlarmManager类的介绍,写的很详细,我这里不做过多描述了,下面来说下我工作中遇到的问题吧. 可能大家在 ...
- android 闹钟取消,Android,如何取消闹钟? alarmManager.cancel无效
我有一个应用程序,您可以在其中创建5个警报,其中创建的内容显示在ListView中,并假设当listView的元素播放了警报但应该从列表视图中删除该项目但警报被删除以达到预定的时间总是声音. 我已经查 ...
- 我的Android进阶之旅------gt;Android使用AlarmManager全局定时器实现定时更换壁纸
该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...
- android闹钟(五):实现闹钟功能
闹钟主页面:AlarmView.java package com.mytest.myclock;import java.util.Calendar;import android.app.AlarmMa ...
- Android 闹钟
需求:新的平台要实现关机启动,所以要了解一下闹钟的机制 这个链接写得比较详细(我只是动手试了试,毕竟应用不是专长):http://www.cnblogs.com/mengdd/p/3819806.ht ...
- android闹钟延时,android闹钟定时启动延时或者直接不启动
自己写的android闹钟功能,需要实现timepicker选择完成后将选择的时间设定为闹钟的启动时间,但是不管怎么改总是没法定时启动 alertDialog = new AlertDialog.Bu ...
- 简单实现 Android 闹钟
Android 闹钟 比如:一次闹钟响过之后开关变为关的状态:直接点击开关不能实现开关闹钟的作用,需要在点击item的菜单中进行更改:未知原因闹钟不准时,不能及时响应,求大神讲解 话不多说,看代码 M ...
最新文章
- Angular 表单验证类库 ngx-validator 1.0 正式发布
- 汇编语言课本习题 p112 3.30
- linux反汇编暴力破解,逆向教程之-反编译apk暴力去除弹窗和更新提示(三)
- 技术负责人的三种角色
- 关于wordpress 点击文章查看内容跳转加载失败(404)的解决方法
- 计算机网络基础题解综合练习实验,计算机网络基础题解•综合练习•实验
- rf调用的python函数报错_Robot Framework(15)- 扩展关键字
- 10 个你可能还不知道 VS Code 使用技巧
- 【翻译】eXpressAppFramework QuickStart 业务模型设计(十)——在代码中实现数据验证...
- jq根据文本显示内容设置样式
- 怎样实现MathType在Numbers中的运用
- 测试用例经典练习之淘宝app购物车测试用例
- 自制恋爱话术APP永久免费使用
- SpringBoot项目配置SSL证书微信小程序jar包
- 【学习笔记】Windows格式文档转换成Unix格式
- 十九、D触发器做二分频器解析:
- Linux命令----压缩解压缩
- 显卡mx150和230哪个好_MX150和GTX1050哪个好?MX150与GTX1050性能天梯图对比
- 国产独立游戏《蛊婆:东海地宫》配置要求一览
- 秒的换算:皮秒、纳秒、微秒、毫秒
热门文章
- linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
- python列表间隔合并_Python使用zip合并相邻列表项的方法示例
- Java协作开发,Java开发学习笔记之八:servlet之间的协作
- 每天一道LeetCode-----判断给定字符串是否符合某个模式
- 核心微生物分析_食品微生物发酵技术行业发展现状调研及投资前景分析报告(2020版)...
- linux服务器nvidia驱动的安装与卸载
- string中删除一个元素
- Hill加密算法(matlab 实现)
- 8086汇编-实验9-字符打印
- 15.17 对缺乏潜在类型机制的补偿