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 ...
随机推荐
- 不可不知的mysql 常用技巧总结
不可不知的mysql 常用技巧总结 mysql常用命令 mysqld --启动mysql数据库 show databases; -- 查看数据库 use database; -- 选择数据库 show ...
- [转]极不和谐的 fork 多线程程序
极不和谐的 fork 多线程程序 继续前几天的话题.做梦幻西游服务器优化的事情.以往的代码,定期存盘的工作分两个步骤,把 VM 里的动态数据序列化,然后把序列化后的数据写盘.这两个步骤,序列化工作并没 ...
- 数据结构学习之stack
不能小看这些基本的数据结构,写了才发现还是会有问题出现的. 有码有真相: #pragma once class MyStack { public: MyStack(void); ~MyStack(vo ...
- 安装apr报错rm: cannot remove `libtoolT': No such file or directory
直接打开/usr/local/src/apr-1.4.6/configure 把 $RM“$cfgfile” 那行删除掉 $RM“$cfgfile” 大约在 42302行 然后再重新运行 ./co ...
- k近邻算法-java实现
最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习. 一 . K-近邻算法(KNN)概述 最简单最初级的分 ...
- 解决安装Egit时Egit Mylyn和org.eclipse.team.core报错
为了让Aptana支持GitHub,需要安装Egit,但在的时候碰到两个错误,一个是关于缺少EGit Mylyn另一个是缺少org.eclipse.egit.import.feature.group. ...
- 【struts2】预定义拦截器
1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...
- 更改Eclipse下Tomcat的部署目录 ,防止上传的文件是到eclipse的克隆的tomcat上的webapp,而不是tomcat本身的webapp
使用eclipse开发是因为机器不够用myeclipse,eclipse也比myeclipse清爽很多,启动速度也快.这里的搭建开发环境使用: Jdk1.6+Tomcat6+Eclipse JEE, ...
- RHEL7 禁用gnome-inital-setup
每次登陆系统后,都会跳出页面gnome-inital-setup 如果觉得讨厌,可以禁止该页面的出现: mkdir ~/.config echo "yes" >> ~/ ...
- OpenGL tutorial资源在mac yosemite下的cmake生成工程问题
如果你在使用cmake -G Xcode -Wno-dev OpenGL_Tutorial 时,出现了pThread.h not found的错误, 碰巧你和我一样使用的还是 2.8 版本的cmake ...