完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 芯灵思FAE 于 2015-11-27 16:52 编辑 上一期我们说到,当初始化完成之后,如果我们有应用想要使用Sensor,他首先会获取Sensor的一个类型,然后使用registerListener的方法,去监听我们一个Sensor,这样我们来看一下整个过程是如何来进行的 首先我们应用层是要拿到Sensor的,然后会注册一个SensorEventListener(),他呢有两个方法,这两个方法是需要我们的应用来重载的,比如说onSensorChanged(),如果说我们底层数据有变化,就会向上把数据发送给SensorManger,而他就会调用我们SensorEventListener()的onSensorChanged()方法,来把这些数据报给我们的应用。这个SensorEventListener()就是我们setlistener所设置的对象,因为SensorManger提供了一个registerListener的方法,如果我们注册了这个Listener,那么我们就可以使用onSensorChanged来接收数据。首先我们要注册Listener,注册这个调用的是SystemSensorManager中的registerListenerImpl()的方法,当我们注册一个Listener的时候就会产生一个消息队列,这个消息队列就是我们的SensorEventQueue,这个就会通过我们SensorManager(cpp)的方法和我们的Sensorservice来进行通讯,当我们使用这个消息队列进行连接之后,如果说我们底层有数据变化,那么就会通过消息队列的方式,并且通过native回调java的方法,来将我们的数据发送给Sensor。 第一个是我们的注册过程,就是通过SensorManger,通过registerListener(),再通过SystemSensorManager,然后创建一个SensorEventQueue,这个消息队列是在我们SensorManager(cpp)层中,然后cpp层和我们Sensorservice层建立起连接,这样我们的数据通道就打通了,如果说Sensor变化,那么我们的数据通路是这样的:首先通过消息队列的方式将我们的数据发送给我们监听的Sensor,监听的应用,这个应用通过native回调java的方法,通过dispatchSensorEventQueue(),将我们的Sensor的数据发送给SystemSensorManager,而他又会通过dispatchSensorEventQueue()的方法回调这个SensorEventListener()的一个实例中的onSensorChanged()的方法,来把这个Sensor数据变化的情况告诉我们的应用,这样我们的应用就会获取到我们底层的数据,大概得通路就是这么个情况,中间还会涉及一些Android特有的编码形式,下面我们来看一下在代码中是如何实现这个通路的。 当我们应用层要注册一个Listener的话那么他最后调的就是我们的registerListenerImpl这个方法 在这个方法中我们会首先看一下有没有这个Listener,如果有的话那么就不用创建,直接调用queue.addSensor的方法,如果没有的话,我们需要创建一个SensorEventQueue,他在当前文件中,它继承了BaseEventQueue,因为在初始化的时候调用了我们的super方法,而这个方法就是我们的BaseEventQueue,他在初始化的时候调用了一个nativeInitBaseEventQueue的方法,我们来看一下他的具体实现 在这个方法中他首先还是要拿到哦我们的SensorManager的一个实例,然后这个queue调用的其实就是我们的SensorManager所创建的一个EventQueue,我们来看一下他的创建过程 创建过程就是和我们的mSensorServer来建立链接,mSensorServer就是我们的Sensorservice,他在这里创建一个SensorEventConnection,当我们建立连接之后,这个connection就会被加入到SensorEventQueue中,这样我们就可以和我们的Sensorservice来建立联系了,当我们把这个创建完成之后,我们就创加了一个android_os_MessageQueue这样的消息队列,我们再来看一下SensorEventQueue的onFirstRef()这个方法 在这个方法中他首先会拿到我们Sensor的一个channel,这个channel其实是由我们的mSensorEventConnection使用的,getSensorChannel()方法所得到的,而我们这个mSensorEventConnection就是我们SensorManager(cpp)和我们的Sensorservice建立连接时候的connection,我们真正调用的getSensorChannel()就是我们Sensorservice.cpp中实现的getSensorChannel,我们进入这个文件来看一下
|
|
相关推荐
5 个讨论
|
|
只有小组成员才能发言,加入小组>>
芯灵思SinlinxA33开发板Linux内核workqueue(附实测代码)
11891 浏览 0 评论
芯灵思SinlinxA33开发板Linux内核 tasklet 机制(附实测代码)
12551 浏览 0 评论
芯灵思Sinlinx A33开发板 Linux内核等待队列poll ---阻塞与非阻塞
34827 浏览 0 评论
芯灵思Sinlinx A33开发板Linux中断编程 3-应用程序
34760 浏览 0 评论
38840 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:11 , Processed in 0.661557 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号