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
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)循环里一直读取 服务端实现 调用时序图