Android 编程下 AlarmManager
对应 AlarmManager 有一个 AlarmManagerServie 服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册的各类闹铃并适时的设置即将触发的闹铃给闹铃设备 ( 在系统中,Linux 实现的设备名为 ”/dev/alarm” ) ,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie 服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序 system_service 启动并初始化闹铃设备 ( /dev/alarm ) 。当然,在 JAVA 层的 AlarmManagerService 与 Linux Alarm 驱动程序接口之间还有一层封装,那就是 JNI。(参考官方文档:AlarmManager | Android Developers)
AlarmManager 将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过 AlarmManager 来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager 与 AlarmManagerServie 之间是通过 Binder 来通信的,他们之间是多对一的关系。
AlarmManager 提供了 8 个与之相关的方法:
|
AlarmManager Public Methods (方法) |
||||||||||||||||
| void |
cancel(PendingIntent operation) 取消参数匹配的闹铃 |
|||||||||||||||
| void |
set(int type, long triggerAtMillis, PendingIntent operation) 注册一个新的闹铃 |
|||||||||||||||
| void |
setExact(int type, long triggerAtMillis, PendingIntent operation) 注册一个新的闹铃,这个闹铃将在指定的时间被准确的执行 |
|||||||||||||||
| void |
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 注册一个对触发时间并不是很精准的闹铃,例如,一个闹铃每小时都会重复,但不一定都是在每个小时的最开始被触发 |
|||||||||||||||
| void |
setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 注册一个重复类型的闹铃 |
|||||||||||||||
| void |
setTime(long millis) 设定系统时钟时间 |
|||||||||||||||
| void |
setTimeZone(String timeZone) 设置系统默认时区 |
|||||||||||||||
| void |
setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation) 注册一个闹铃,这个闹铃将在给定的时间窗口内被触发 |
|||||||||||||||
|
Constants (类型) |
||||||||||||||||
|
public static final int ELAPSED_REALTIME Constant Value: 3 (0x00000003) 这种类型的闹铃不会唤醒系统,如果这种闹铃在系统休眠状态终止,它会在系统下次唤醒的时候被触发。该种闹铃所用的时间是相对时间,是从系统启动后开始 计时的,包括睡眠时间,可以通过调用 SystemClock.elapsedRealtime() 获得。 |
||||||||||||||||
|
public static final int ELAPSED_REALTIME_WAKEUP Constant Value: 2 (0x00000002) 这种类型的闹铃能在终止的时候唤醒系统,用法同 ELAPSED_REALTIME。 |
||||||||||||||||
|
public static final long INTERVAL_DAY Constant Value: 86400000 (0x0000000005265c00) |
||||||||||||||||
|
public static final long INTERVAL_FIFTEEN_MINUTES Constant Value: 900000 (0x00000000000dbba0) |
||||||||||||||||
|
public static final long INTERVAL_HALF_DAY Constant Value: 43200000 (0x0000000002932e00) |
||||||||||||||||
|
public static final long INTERVAL_HALF_HOUR Constant Value: 1800000 (0x00000000001b7740) |
||||||||||||||||
|
public static final long INTERVAL_HOUR Constant Value: 3600000 (0x000000000036ee80) |
||||||||||||||||
|
public static final int RTC Constant Value: 1 (0x00000001) 这种类型的闹铃不会唤醒系统,如果这种闹铃在系统休眠状态终止,它会在系统下次唤醒的时候被触发。该闹铃所用的时间是绝对时间,可以通过调用 System.currentTimeMillis() (wall clock time in UTC) 获得。 |
||||||||||||||||
|
public static final int RTC_WAKEUP Constant Value: 0 (0x00000000) 这种类型的闹铃能在终止的时候唤醒系统,用法同 RTC。 |
注意一个重要的参数 PendingIntent。这个 PendingIntent 可以说是 Intent 的进一步封装, 因为它不仅对 Intent 进行了描述,也对使用该 Intent 所要完成的目标动作进行了描述。开发者可以通过以下六个方法来获得 PendingIntent 实例。(参考官方文档:PendingIntent | Android Developers)
|
PendingIntent Public Methods (方法) |
||||||||||||||||
| static PendingIntent |
getActivities(Context context, int requestCode, Intent[] intents, int flags) 方法同 getActivity(Context, int, Intent, int),但允许提交一个由多个 Intent 组成的数组 |
|||||||||||||||
| static PendingIntent |
getActivities(Context context, int requestCode, Intent[] intents, int flags, Bundle options) 方法同 getActivity(Context, int, Intent, int),但允许提交一个由多个 Intent 组成的数组 |
|||||||||||||||
| static PendingIntent |
getActivity(Context context, int requestCode, Intent intent, int flags) 返回一个可以打开新 Activity 的 PendingIntent,相当于调用 Context.startActivity(Intent)。 |
|||||||||||||||
| static PendingIntent |
getActivity(Context context, int requestCode, Intent intent, int flags, Bundle options) 返回一个可以打开新 Activity 的 PendingIntent,相当于调用 Context.startActivity(Intent)。 |
|||||||||||||||
| static PendingIntent |
getBroadcast(Context context, int requestCode, Intent intent, int flags) 返回一个可以发送广播的 PendingIntent,相当于调用 Context.sendBroadcast()。 |
|||||||||||||||
| static PendingIntent |
getService(Context context, int requestCode, Intent intent, int flags) 返回一个可以启动服务的 PendingIntent,相当于调用 Context.startService()。 |
|||||||||||||||
Android 编程下 AlarmManager的更多相关文章
- Android 编程下 App Install Location
从 API 8 开始(参考官方文档:App Install Location | Android Developers),你可以将你的应用安装在外部储存中(例如,安装到设备的 SD 卡上).这是一个可 ...
- Android 编程下的自定义 xmlns
什么是 xmlns xmlns是 XML Namespaces 的缩写,中文名称是 XML命名空间. xmlns 使用规则 xmlns:namespace-prefix="namespace ...
- Android 编程下 DP、SP 以及屏幕像素密度
有时需为视图属性指定大小尺寸值(通常以像素为单位,但有时也用点.毫米或英寸).最常见的属性有: 文字大小(Text Size),指设备上显示的文字像素高度: 边距(Margin),指定视图组件间的距离 ...
- Android 编程下 Touch 事件的分发和消费机制
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...
- Android 编程下的四大组件之服务(Service)
服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始.Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类 ...
- Android 编程下的 Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...
- Android 编程下图片的内存优化
1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 ...
- Android 编程下的代码混淆
什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...
- Android 编程下去除 ListView 上下边界蓝色或黄色阴影
默认的情况下,在 ListView 滑动到顶部或者是底部的时候,会有黄色或者蓝色的阴影出现.在不同的版本上解决的方法是不同的,在 2.3 版本之前可以在 ListView 的属性中通过设置 andro ...
随机推荐
- codeM 2018 资格赛
比赛链接:https://www.nowcoder.com/activity/2018codem/index?from=meituan 1.下单 给定若干商品,可以选择打折.满减两种方式. #incl ...
- Fusion-io ioDrive Duo Enterprise PCIe Review
原文地址:http://www.storagereview.com/fusionio_iodrive_duo_enterprise_pcie_review As part of StorageRevi ...
- Android-- ArrayAdapter用法举例(转载)
近期很多Android开发者来函表示对ArrayAdapter和BaseAdapter的区别不是很清楚,这里Android123简单说下他们的关系和用处,ArrayAdapter是从BaseAdapt ...
- SQL如何获得本季度第一天、一年的第一天、本月的最后一天
nterval 参数,具有以下设定值: 设置 描述 Year yy, yyyy 年 quarter qq, q 季 Month mm, m 月 dayofyear dy, y 一年的日数 Day dd ...
- Android如何实现点击一次返回键返回桌面而不是退出应用
具体代码如下所示: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent. ...
- Javscript调用iframe框架页面中函数的方法
Javscript调用iframe框架页面中函数的方法,可以实现iframe之间传值或修改值了, 访问iframe里面的函数: window.frames['CallCenter_iframe'].h ...
- Oracle 12C -- clone a remote pdb
Connect to the remote CDB and prepare the remote PDB for cloning. SQL> select con_id,dbid,name,op ...
- CSS的Class以及ID选择器
9.CSS的Class以及ID选择器 id和class的不同指出在于一个页面同一个ID只能只有一次,而class可以无限制使用. 同样,你可以在html选择器后面使用一个选择器来指定特殊HTML元素, ...
- linux 文件系统 xfs、ext4、ext3 的区别
前言 centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext3介绍 ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时 ...
- 用 Fiddler 来弥补 Chrome Network 的小缺点
由于经常要查看后端的接口详情,但Chrome控制台的Network并不会全显api路径,而且每次需要先启动控制台,再进行请求才能记录到.大多数情况下都是要刷新页面,这会浪费很多时间. 还不如开一个 F ...