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 ...
随机推荐
- 《Java设计模式》之模板方法模式
模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...
- 【Android开发经验】怎样查看android-support-v4支持包中的源代码
在support-v4包里面.加入了非常多的支持控件,比方ViewPager,Fragment等,为了解决一些问题,我们有时候想要看一下实现源代码,可是点进去之后.源代码并不会显示出来,会出现以下的情 ...
- Asp.Net通过ODBC连接Oracle数据库
本来有个项目是通过安装Oracle client然后让asp.net引用System.Data.OracleClient来访问Oracle数据库的,但是不知道为什么老是报:ORA-12170:连接超时 ...
- 十问Android NFC手机上的卡模拟(转)
1, 问:能否在AndroidNFC手机上实现卡模拟? 答:在技术上可行,但是,对一般开发人员来讲,目前看来仅仅是技术上可行:( 2, 问:具体如何实现呢? 答:有两种方式:一种是基于硬件的,被称 ...
- ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?
我们知道ASP.NET MVC有个强大的地方就是Form表单提交到action的时候,可以直接将Form的参数直接装配到action的参数实体对象中 比如 action方法 Register(User ...
- [转]shell awk sed tr grep 语法汇总
tr 基本语法 -c # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII -d # 删除字符串1中所有输入字符 -s # 删除所 ...
- JAVA List删除时需注意的地方
JAVA的LIST在删除时,一般会用list.remove(o); 但这样往往会出现问题,先来看下面的这段代码: package com.demo; import java.util.ArrayLis ...
- windbg dds、dps、dqs
dds.dps和dqs命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dqs是每8字节视为一个符号,dps是根据当前处理 ...
- iOS扩大UIButton按钮的可点击区域
一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...