Sensor整体架构

  【Android】Sensor框架Framework层解读

整体架构说明

  1. 黄色部分表示硬件,它要挂在I2C总线上
  2. 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数据传到HAL层,准确说是HAL从Event读
  3. 绿色部分表示动态库,它封装了整个Sensor的IPC机制,如SensorManager是客户端,SensorService是服务端,HAL部分是封装了服务端对Kernel的直接访问
  4. 蓝色部分就是我们的Framework和Application了,JNI负责访问Sensor的客户端,而Application就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果,如屏幕旋转,打电话时灭屏,自动调接背光(这三个功能的具体实现会在以后分析)

 


Sensor总体调用关系图

  本节主要解读Android的Framework层框架。

  【Android】Sensor框架Framework层解读

 

  Sensor 框架分为三个层次,客户度、服务端、HAL层,服务端负责从HAL读取数据,并将数据写到管道中,客户端通过管道读取服务端数据。

客户端主要类

  SensorManager.java

    从android4.1开始,把SensorManager定义为一个抽象类,定义了一些主要的方法,该类主要是应用层直接使用的类,提供给应用层的接口

  SystemSensorManager.java

    继承于SensorManager,客户端消息处理的实体,应用程序通过获取其实例,并注册监听接口,获取sensor数据。

  sensorEventListener接口

    用于注册监听的接口

  sensorThread

    SystemSensorManager的一个内部类,开启一个新线程负责读取读取sensor数据,当注册了sensorEventListener接口的时候才会启动线程

  android_hardware_SensorManager.cpp

    负责与java层通信的JNI接口

  SensorManager.cpp

    sensorNative层的客户端,负责与服务端SensorService.cpp的通信

  SenorEventQueue.cpp

    消息队列

服务端主要类

  SensorService.cpp

    服务端数据处理中心

  SensorEventConnection

    从BnSensorEventConnection继承来,实现接口ISensorEventConnection的一些方法,ISensorEventConnectionSensorEventQueue会保存一个指针,指向调用服务接口创建的SensorEventConnection对象

  Bittube.cpp

    在这个类中创建了管道,用于服务端与客户端读写数据

  SensorDevice

    负责与HAL读取数据

HAL

  Sensor.hgoogleSensor定义的Hal接口,单独提出去

 


客户端读取数据

调用时序图

 【Android】Sensor框架Framework层解读

apk注册监听器

SensorManager  mSensorManager =
 (SensorManager)getSystemService(SENSOR_SERVICE);
 Sensor   mAccelerometer =
 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
 
    protected void onResume() {
           super.onResume();
          mSensorManager. registerListenerImpl (this, mAccelerometer,
     SensorManager.SENSOR_DELAY_NORMAL);
     }
     protected void onPause() {
           super.onPause();
         mSensorManager.unregisterListener(this);
     }
 
public interface SensorEventListener {
    public void onSensorChanged(SensorEvent event);
    public void onAccuracyChanged(Sensor sensor, int accuracy);   
}
View Code

相关文章: