Sensor框架Framework层解读 - 图文(2)

2019-08-30 22:56

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

Activity实现了SensorEventListener接口。

在onCreate方法中,获取SystemSensorManager,并获取到加速传感器的Sensor; 在onResume方法中调用SystemSensorManager,registerListenerImpl注册监听器; 当Sensor数据有改变的时候将会回调onSensorChanged方法。

初始化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 fullList = sFullSensorsList;

int i = 0; do {

Sensor sensor = new Sensor();

i = sensors_module_get_next_sensor(sensor, i);

if (i>=0) {

//Log.d(TAG, \sensor.getName() +

// \sensor.getHandle());

fullList.add(sensor);

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

}

} while (i>0);

sPool = new

SensorEventPool( sFullSensorsList.size()*2 );

sSensorThread = new SensorThread(); } } }

View Code

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

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

2. 初始化Sensor列表:调用JNI函数sensors_module_init,对Sensor模块进行初始化。创建了

native层SensorManager的实例。

3. 获取Sensor列表:调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在

sHandleToSensor列表中

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

动线程

启动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) { l = new ListenerDelegate(listener, sensor, handler); sListeners.add(l); ……

if (sSensorThread.startLocked()) {

if (!enableSensorLocked(sensor, delay)) { ……. } ……

} else if (!l.hasSensor(sensor)) { l.addSensor(sensor);

if (!enableSensorLocked(sensor, delay)) { …… } } }

return result; }

View Code

当有应用程序调用registerListenerImpl()方法注册监听的时候,会调用SensorThread.startLoacked()启动线程。

线程只会启动一次,并调用enableSensorLocked()接口对指定的sensor使能,并设置采样时间。

SensorThreadRunnable实现了Runnable接口,在SensorThread类中被启动

boolean startLocked() { try {

if (mThread == null) {

SensorThreadRunnable runnable = new SensorThreadRunnable();

Thread thread = new Thread(runnable, SensorThread.class.getName());

thread.start();

synchronized (runnable) { //队列创建成功,线程同步

while (mSensorsReady == false) { runnable.wait(); } } }

private class SensorThreadRunnable implements Runnable { SensorThreadRunnable() { }

private boolean open() {

sQueue = sensors_create_queue(); return true; }

public void run() { …….

if (!open()) { return; }

synchronized (this) { mSensorsReady = true; this.notify(); }

while (true) {

final int sensor = sensors_data_poll(sQueue, values, status, timestamp);

……. } } }

View Code

在open函数中调用JNI函数sensors_create_queue()来创建消息队列,然后调用SensorManager. createEventQueue()创建。

在startLocked函数中启动新的线程后,做了一个while的等待while (mSensorsReady == false),只有当mSensorsReady等于true的时候,才会执行enableSensorLocked()函数对sensor使能。而mSensorsReady变量,是在open()调用创建消息队列成功之后才会true,所以认为,三个功能调用顺序是如下:

1. 调用open函数创建消息队列

2. 调用enableSensorLocked()函数对sensor使能

3. 调用sensors_data_poll从消息队列中读取数据,而且是在while (true)循环里一直读取 服务端实现 调用时序图


Sensor框架Framework层解读 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:注册分类1、2、3、5.1类申报资料要求(试行)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: