打印
[资料分享]

安卓底层开发学习经验第二十五期(下)

[复制链接]
537|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
上一期我们说到,当初始化完成之后,如果我们有应用想要使用Sensor,他首先会获取Sensor的一个类型,然后使用registerListener的方法,去监听我们一个Sensor,这样我们来看一下整个过程是如何来进行的
首先我们应用层是要拿到Sensor的,然后会注册一个SensorEventListener(),他呢有两个方法,这两个方法是需要我们的应用来重载的,比如说onSensorChanged(),如果说我们底层数据有变化,就会向上把数据发送给SensorManger,而他就会调用我们SensorEventListener()onSensorChanged()方法,来把这些数据报给我们的应用。这个SensorEventListener()就是我们setlistener所设置的对象,因为SensorManger提供了一个registerListener的方法,如果我们注册了这个Listener,那么我们就可以使用onSensorChanged来接收数据。首先我们要注册Listener,注册这个调用的是SystemSensorManager中的registerListenerImpl()的方法,当我们注册一个Listener的时候就会产生一个消息队列,这个消息队列就是我们的SensorEventQueue,这个就会通过我们SensorManagercpp)的方法和我们的Sensorservice来进行通讯,当我们使用这个消息队列进行连接之后,如果说我们底层有数据变化,那么就会通过消息队列的方式,并且通过native回调java的方法,来将我们的数据发送给Sensor
第一个是我们的注册过程,就是通过SensorManger,通过registerListener(),再通过SystemSensorManager,然后创建一个SensorEventQueue,这个消息队列是在我们SensorManagercpp)层中,然后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这样的消息队列,我们再来看一下SensorEventQueueonFirstRef()这个方法
在这个方法中他首先会拿到我们Sensor的一个channel,这个channel其实是由我们的mSensorEventConnection使用的,getSensorChannel()方法所得到的,而我们这个mSensorEventConnection就是我们SensorManagercpp)和我们的Sensorservice建立连接时候的connection,我们真正调用的getSensorChannel()就是我们Sensorservice.cpp中实现的getSensorChannel,我们进入这个文件来看一下
在这里返回一个mChannel,他在定义就是当我们进行SensorEvent进行连接的时候创建的一个BitTube,这个就是我们进行数据传输的一个通道。
后边还有一些内容介绍,但是涉及到了太多的函数,如果这样只是截图出来就显得太乱了,所以这一期的视频有需要的朋友可以留言,如果本人看到一定会奉上的,谢谢大家的支持。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝