



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ADROID 2.1 架构解析闹钟分析透彻,有点基础都能看懂!1 设置定时时间文件:packages/apps/alarmclock/src/com/android/alarmclock/Alarms.javaprivate static void enableAlert(Context context, final Alarm alarm, final long atTimeInMillis) AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); . am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender); . 由闹钟管理器设置定时时间。2 闹钟管理器2.1 定时设置文件:frameworks/base/core/java/android/app/AlarmManager.javapublic static final int RTC_WAKEUP = 0; public static final int RTC = 1; public static final int ELAPSED_REALTIME_WAKEUP = 2;public static final int ELAPSED_REALTIME = 3; AlarmManager(IAlarmManager service) mService = service; public void set(int type, long triggerAtTime, PendingIntent operation) try mService.set(type, triggerAtTime, operation); catch (RemoteException ex) 将type, triggerAtTime, operation等参数转向闹钟管理器服务。3 闹钟管理器服务文件:frameworks/base/services/java/com/android/server/AlarmManagerService.java3.1 定时设置public AlarmManagerService(Context context) mDescriptor = init(); .public void set(int type, long triggerAtTime, PendingIntent operation) setRepeating(type, triggerAtTime, 0, operation); public void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) if (operation = null) Log.w(TAG, set/setRepeating ignored because there is no intent); return; synchronized (mLock) Alarm alarm = new Alarm(); alarm.type = type; alarm.when = triggerAtTime; alarm.repeatInterval = interval; alarm.operation = operation; / Remove this alarm if already scheduled. removeLocked(operation); if (localLOGV) Log.v(TAG, set: + alarm); int index = addAlarmLocked(alarm); if (index = 0) setLocked(alarm); private void setLocked(Alarm alarm) if (mDescriptor != -1) set(mDescriptor, alarm.type, (alarm.when * 1000 * 1000); else Message msg = Message.obtain(); msg.what = ALARM_EVENT; mHandler.removeMessages(ALARM_EVENT); mHandler.sendMessageAtTime(msg, alarm.when); Init,set 为底层操作函数,set(mDescriptor, alarm.type, (alarm.when * 1000 * 1000); 由底层来完成定时设置。3.2等待计时结束private class AlarmThread extends Thread public void run() . while (true) int result = waitForAlarm(mDescriptor); . if (result & RTC_WAKEUP_MASK) != 0) triggerAlarmsLocked(mRtcWakeupAlarms, triggerList, nowRTC); if (result & RTC_MASK) != 0) triggerAlarmsLocked(mRtcAlarms, triggerList, nowRTC); if (result & ELAPSED_REALTIME_WAKEUP_MASK) != 0)triggerAlarmsLocked(mElapsedRealtimeWakeupAlarms,triggerList, nowELAPSED); if (result & ELAPSED_REALTIME_MASK) != 0) triggerAlarmsLocked(mElapsedRealtimeAlarms, triggerList, nowELAPSED); . 在服务里采用线程来处理计时结束返回的信息,根据等待计时结束返回的信息触发不同的操作。4 硬件调用(JNI机制)文件:frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp4.1 定时设置static jint android_server_AlarmManagerService_init(JNIEnv* env, jobject obj)#if HAVE_ANDROID_OS return open(/dev/alarm, O_RDWR);#else return -1;#endifstatic void android_server_AlarmManagerService_close(JNIEnv* env, jobject obj, jint fd)#if HAVE_ANDROID_OS close(fd);#endifstatic void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong nanoseconds)#if HAVE_ANDROID_OS struct timespec ts; ts.tv_sec = NANOSECONDS_TO_SECONDS(nanoseconds); ts.tv_nsec = nanoseconds - SECONDS_TO_NANOSECONDS(ts.tv_sec); int result = ioctl(fd, ANDROID_ALARM_SET(type), &ts); if (result 0) LOGE(Unable to set alarm to %lld: %sn, nanoseconds, strerror(errno); #endif以上函数的绑定如下: init, ()I, (void*)android_server_AlarmManagerService_init, close, (I)V, (void*)android_server_AlarmManagerService_close, set, (IIJ)V, (void*)android_server_AlarmManagerService_set,由上可知,通过ioctl接口,设置定时时间。4.2 等待计时结束static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject obj, jint fd)#if HAVE_ANDROID_OS int result = 0; do result = ioctl(fd, ANDROID_ALARM_WAIT); while (result 0 & errno = EINTR); if (result 0) LOGE(Unable to wait on alarm: %sn, strerror(errno); return 0; return result;#endif以上函数的绑定如下:waitForAlarm, (I)I, (void*)android_server_AlarmManagerService_waitForAlarm,由上可知,代码阻塞方式等待计时结束或由意外中断结束。4 杂项4.1 闹钟类型public static final int ELAPSED_REALTIME /当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3(0x00000003)。 public static final int ELAPSED_REALTIME_WAKEUP /能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。 public static final int RTC /当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。public static final int RTC_WAKEUP /能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。 Public static final int POWER_OFF_WAKEUP /能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。 4.2 底层实现在IOCTL中ANDROID_ALARM_SET
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 入院评估课件
- 健康骨骼知识培训课件
- 俄罗斯政府课件
- 企业疫情期间安全培训课件
- 企业环境安全培训的作用
- 社区纪委考核管理办法
- 社区干部纪律管理办法
- 数字农业的新质生产力特征
- 2025国家能源集团招聘笔试历年参考题库附带答案详解
- 出租车防御性驾驶
- 迪拜果蔬市场发展趋势与前景分析
- 2025年调饮师职业技能竞赛(省赛)考试题库(含答案)
- 购买邻居土地协议书
- 工程部员工绩效考核方案
- 新生美术体验课件
- 公司事故隐患内部报告奖励制度
- 人教部编版七年级语文上册教学计划(及进度表)
- Python工程应用-数据分析基础与实践课件-第3章
- 年满七十岁以上老年人驾考三力能力测试题库
- 集成电路测试指南
- 铝合金搅拌摩擦焊技术研究进展
评论
0/150
提交评论