android闹钟功能报告.docx

上传人:b****4 文档编号:11679347 上传时间:2023-03-30 格式:DOCX 页数:7 大小:44.68KB
下载 相关 举报
android闹钟功能报告.docx_第1页
第1页 / 共7页
android闹钟功能报告.docx_第2页
第2页 / 共7页
android闹钟功能报告.docx_第3页
第3页 / 共7页
android闹钟功能报告.docx_第4页
第4页 / 共7页
android闹钟功能报告.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

android闹钟功能报告.docx

《android闹钟功能报告.docx》由会员分享,可在线阅读,更多相关《android闹钟功能报告.docx(7页珍藏版)》请在冰豆网上搜索。

android闹钟功能报告.docx

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等参数转向闹钟管理器服务。

       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)。

  

 publicstaticfinalintRTC  

 //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。

直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用System.currentTimeMillis()获得。

系统值是1(0x00000001)。

   

publicstaticfinalintRTC_WAKEUP  

//能唤醒系统,用法同RTC类型,系统值为0(0x00000000)。

  

 PublicstaticfinalintPOWER_OFF_WAKEUP  

 //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。

使用方法同RTC类型,系统值为4(0x00000004)。

4.2底层实现

在IOCTL中ANDROID_ALARM_SET(0)设置闹钟;

在IOCTL中ANDROID_ALARM_WAIT:

等待闹钟时间,其中

rv=wait_event_interruptible(alarm_wait_queue,alarm_pending);会阻塞,在xxmins后alarm_timer_triggered函数中改变alarm_pending值为真,并唤醒等待队列。

wake_up(&alarm_wait_queue);

在ANDROID_ALARM_WAIT的最后释放alarm_rtc_wake_lock。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1