Sensor Framework原理

本文深入解析Android Sensor Framework的架构和工作原理,涵盖客户端、服务端和HAL层的交互过程,详细阐述了数据从HAL层传递到客户端的完整路径,包括注册监听器、创建消息队列、启动线程读取数据等关键步骤,以及服务端如何从HAL读取数据并写入管道。通过对调用时序图和代码分析,展示了Sensor数据在客户端和服务端间的通信机制。
摘要由CSDN通过智能技术生成


1
 总体调用关系图



Sensor 框架分为三个层次,客户度、服务端、HAL层,服务端负责从HAL读取数据,并将数据写到管道中,客户端通过管道读取服务端数据。下面简单解释类的功能

1.1客户端主要类

n         SensorManager.java

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

n         SystemSensorManager.java

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

n         sensorEventListener接口

用于注册监听的接口

n         sensorThread

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

n         android_hardware_SensorManager.cpp

负责与java层通信的JNI接口

n         SensorManager.cpp

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

n         SenorEventQueue.cpp

消息队列

1.2服务端主要类

n         SensorService.cpp

服务端数据处理中心

n         SensorEventConnection

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

n         Bittube.cpp

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

n         SensorDevice

负责与HAL读取数据

1.3 HAL

   Sensor.hgoogleSensor定义的Hal接口,这里我们主要介绍Framework层。sensor HAL介绍http://blog.sina.com.cn/s/blog_89f592f5010130c8.html

2客户端读取数据

2.1 调用时序图


2.2 代码分析

2.2.1 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);   

}

 

没有把全部代码写出来,Activity实现了SensorEventListener接口,在onCreate方法中,获取SystemSensorManager,并获取到加速传感器的Sensor,在onResume方法中调用SystemSensorManager. registerListenerImpl注册监听器,当Sensor数据有改变的时候将会回调onSensorChanged方法。

2.2.2初始化SystemSensorManager

    public SystemSensorManager(Context context,Looper mainLooper) {

        mMainLooper = mainLooper;       

              mContext = context;

             

        synchronized(sListeners) {

            if (!sSensorModuleInitialized) {

                sSensorModuleInitialized = true;

 

                nativeClassInit();

 

                // initialize the sensor list

                sensors_module_init();

                final ArrayList<Sensor> fullList = sFullSensorsList;

                int i = 0;

                do {

                    Sensor sensor = new Sensor();

                    i = sensors_module_get_next_sensor(sensor, i);

 

                    if (i>=0) {

                        //Log.d(TAG, "found sensor: " + sensor.getName() +

                        //        ", handle=" + sensor.getHandle());

                        fullList.add(sensor);

                        sHandleToSensor.append(sensor.getHandle(), sensor);

                    }

                } while (i>0);

 

                sPool = new SensorEventPool( sFullSensorsList.size()*2 );

                sSensorThread = new SensorThread();

            }

        }

    }

 

系统开机启动的时候,会创建SystemSensorManager的实例,在其构造函数中,主要做了四件事情:

n         初始化JNI

调用JNI函数nativeClassInit()进行初始化

n         初始化Sensor列表

调用JNI函数sensors_module_init,对Sensor模块进行初始化。创建了nativeSensorManager的实例。

n         获取Sensor列表

调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在sHandleToSensor列表中

n         构造SensorThread

构造线程的类函数,并没有启动线程,当有应用注册的时候才会启动线程

2.2.3启动SensorThread线程读取消息队列中数据

protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,

            int delay, Handler handler) {

    

        synchronized (sListeners) {

            ListenerDelegate l = null;

            for (ListenerDelegate i : sListeners) {

                if (i.getListener() == listener) {

                    l = i;

                }

            }

            …….

            // if we don't find it, add it to the list

            if (l == null) {

<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值