Android Sensor (2) -- Sensor 架构及app的回调方式

余生长醉 提交于 2019-11-29 18:32:01

 

1.1 Sensor架构

1.1.1.数据传递方式

App -->I2C过程: app通过SensorManager,getSystemServer调用到SystemSensorManager SystemSensorManager通过jni调用到SensorManager.cpp ,通过binder createconnection调用到SensorService

SensorService通过SystemServer启动,Sensor调用到hal kernel

I2c向app传递数据: SensorService 在是一个binder线程,threadloop方法中device.poll来读 发送数据,通过BitTube(跨进程socket) sendEvents 把数据传递到android_hardware_SensorManager.cpp 这个jni中,

通过JNI调用,调用到java层SystemSensorManager中的SensorEventQueue.dispatchSensorEvent,通过app向SensorEventQueue注册的mListener,来回调数据到app的onSensorChanged()方法

 

 

1.2  mSensorManager.registerListener

@frameworks/base/core/java/android/hardware/SensorManager.java
public boolean registerListener(SensorEventListener listener, Sensor sensor,
        int samplingPeriodUs) {
    return registerListener(listener, sensor, samplingPeriodUs, null);
}

public boolean registerListener(SensorEventListener listener, Sensor sensor,
        int samplingPeriodUs, Handler handler) {
    int delay = getDelay(samplingPeriodUs);
    return registerListenerImpl(listener, sensor, delay, handler, 0, 0);
}

/** @hide */
protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
        int delayUs, Handler handler, int maxReportLatencyUs, int reservedFlags);
@SystemSensorManager.java
public class SystemSensorManager extends SensorManager {
    @Override
    protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
            int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
        ...
        synchronized (mSensorListeners) {
            SensorEventQueue queue = mSensorListeners.get(listener);
            if (queue == null) {
                Looper looper = (handler != null) ? handler.getLooper() : mMainLooper;
                final String fullClassName = listener.getClass().getEnclosingClass() != null ?
                    listener.getClass().getEnclosingClass().getName() :
                    listener.getClass().getName();
                queue = new SensorEventQueue(listener, looper, this, fullClassName);   //SensorEventQueue
                if (!queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs)) {    //addSensor
                    queue.dispose();
                    return false;
                }
                mSensorListeners.put(listener, queue);
                return true;
            } else {
                return queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs);
            }
        }
    }

 

//SensorEventQueue继承BaseEventQueue
static final class SensorEventQueue extends BaseEventQueue {
private final SensorEventListener mListener;
private final SparseArray<SensorEvent> mSensorsEvents = new SparseArray<SensorEvent>();

public SensorEventQueue(SensorEventListener listener, Looper looper,
        SystemSensorManager manager, String packageName) {
    super(looper, manager, OPERATING_MODE_NORMAL, packageName);
    mListener = listener;     //app 注册Service就会把这个Listener注册
}

//写入SensorEvent 到addSensorEvent
@Override
public void addSensorEvent(Sensor sensor) {
    SensorEvent t = new SensorEvent(Sensor.getMaxLengthValuesArray(sensor,
            mManager.mTargetSdkLevel));
    synchronized (mSensorsEvents) {
        mSensorsEvents.put(sensor.getHandle(), t);    //mSensorsEvents.put
    }
}

//在addSensorEvent put事件后,通过mSensorsEvents.get获取事件,然后通过mListener分发,这里的mListener通过app传递过来
// Called from native code.
@SuppressWarnings("unused")
@Override
protected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,
        long timestamp) {
    synchronized (mSensorsEvents) {
        t = mSensorsEvents.get(handle);   //mSensorsEvents.get
    }

    // call onAccuracyChanged() only if the value changes
    final int accuracy = mSensorAccuracies.get(handle);
    if ((t.accuracy >= 0) && (accuracy != t.accuracy)) {
        mSensorAccuracies.put(handle, t.accuracy);
        mListener.onAccuracyChanged(t.sensor, t.accuracy);   //onAccuracyChanged
    }
    mListener.onSensorChanged(t);   //回调 onSensorChanged,这里mListener和应用是一致的
}

 

客户端发送数据

handleEvent方法获取数据之后, 回调Java层SystemSensorManager的内部类SensorEventQueue的dispatchSensorEvent方法。

env->CallVoidMethod(receiverObj.get(),gBaseEventQueueClassInfo.dispatchSensorEvent,

buffer[i].sensor, mScratch, status, buffer[i].timestamp);

最后调用注册的onSensorChanged吐出数据

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!