android闹钟功能报告.docx
- 文档编号:30077340
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:10
- 大小:73.47KB
android闹钟功能报告.docx
《android闹钟功能报告.docx》由会员分享,可在线阅读,更多相关《android闹钟功能报告.docx(10页珍藏版)》请在冰豆网上搜索。
android闹钟功能报告
android闹钟功能报告
ADROID2.1架构解析——闹钟
分析透彻,有点基础都能看懂!
1设置定时时间
文件:
packages/apps/alarmclock/src/com/android/alarmclock/Alarms.java
privatestaticvoidenableAlert(Contextcontext,finalAlarmalarm,
finallongatTimeInMillis){
AlarmManageram=(AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
...
am.set(AlarmManager.RTC_WAKEUP,atTimeInMillis,sender);
...
}
由闹钟管理器设置定时时间。
2闹钟管理器
2.1定时设置
文件:
frameworks/base/core/java/android/app/AlarmManager.java
publicstaticfinalintRTC_WAKEUP=0;
publicstaticfinalintRTC=1;
publicstaticfinalintELAPSED_REALTIME_WAKEUP=2;
publicstaticfinalintELAPSED_REALTIME=3;
AlarmManager(IAlarmManagerservice){
mService=service;
}
publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){
try{
mService.set(type,triggerAtTime,operation);
}catch(RemoteExceptionex){
}
}
将type,triggerAtTime,operation等参数转向闹钟管理器服务。
3闹钟管理器服务
文件:
frameworks/base/services/java/com/android/server/AlarmManagerService.java
3.1定时设置
publicAlarmManagerService(Contextcontext){
mDescriptor=init();
...
}
publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){
setRepeating(type,triggerAtTime,0,operation);
}
publicvoidsetRepeating(inttype,longtriggerAtTime,longinterval,
PendingIntentoperation){
if(operation==null){
Log.w(TAG,"set/setRepeatingignoredbecausethereisnointent");
return;
}
synchronized(mLock){
Alarmalarm=newAlarm();
alarm.type=type;
alarm.when=triggerAtTime;
alarm.repeatInterval=interval;
alarm.operation=operation;
//Removethisalarmifalreadyscheduled.
removeLocked(operation);
if(localLOGV)Log.v(TAG,"set:
"+alarm);
intindex=addAlarmLocked(alarm);
if(index==0){
setLocked(alarm);
}
}
}
privatevoidsetLocked(Alarmalarm)
{
if(mDescriptor!
=-1)
{
set(mDescriptor,alarm.type,(alarm.when*1000*1000));
}
else
{
Messagemsg=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等待计时结束
privateclassAlarmThreadextendsThread
{
publicvoidrun()
{
...
while(true)
{
intresult=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.cpp
4.1定时设置
staticjintandroid_server_AlarmManagerService_init(JNIEnv*env,jobjectobj)
{
#ifHAVE_ANDROID_OS
returnopen("/dev/alarm",O_RDWR);
#else
return-1;
#endif
}
staticvoidandroid_server_AlarmManagerService_close(JNIEnv*env,jobjectobj,jintfd)
{
#ifHAVE_ANDROID_OS
close(fd);
#endif
}
staticvoidandroid_server_AlarmManagerService_set(JNIEnv*env,jobjectobj,jintfd,jinttype,jlongnanoseconds)
{
#ifHAVE_ANDROID_OS
structtimespects;
ts.tv_sec=NANOSECONDS_TO_SECONDS(nanoseconds);
ts.tv_nsec=nanoseconds-SECONDS_TO_NANOSECONDS(ts.tv_sec);
intresult=ioctl(fd,ANDROID_ALARM_SET(type),&ts);
if(result<0)
{
LOGE("Unabletosetalarmto%lld:
%s\n",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等待计时结束
staticjintandroid_server_AlarmManagerService_waitForAlarm(JNIEnv*env,jobjectobj,jintfd)
{
#ifHAVE_ANDROID_OS
intresult=0;
do
{
result=ioctl(fd,ANDROID_ALARM_WAIT);
}while(result<0&&errno==EINTR);
if(result<0)
{
LOGE("Unabletowaitonalarm:
%s\n",strerror(errno));
return0;
}
returnresult;
#endif
}
以上函数的绑定如下:
{"waitForAlarm","(I)I",(void*)android_server_AlarmManagerService_waitForAlarm},
由上可知,代码阻塞方式等待计时结束或由意外中断结束。
4杂项
4.1闹钟类型
publicstaticfinalintELAPSED_REALTIME
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。
直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。
系统值是3 (0x00000003)。
publicstaticfinalintELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2(0x00000002)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 闹钟 功能 报告