android中Sensor 工作流程
JAVA 程序我们使用 sensor 接口一般只要注册一下 SensorListener 像下面这样
**************************************************************
ApiDemo:
mGraphView = new GraphView(this);
mSensorManager.registerListener(mGraphView,....);
**************************************************************
这里的 listener 是因为 sensor 状态变化要产生变化的控件
然后在控件里重载 on
SensorChanged 和 onAccuracyChanged 方法
public void onSensorChanged(int sensor, float[] values)
public void onAccuracyChanged(int sensor, int accuracy)
SensorManager
Sensor 主体代码和流程在 frameworks/base/core/java/android/hardware/SensorManager.java 里面
1.registerListener 其实是调用 registerLegacyListener:
public boolean registerListener(SensorListener listener, int sensors, int rate) {
...
result = registerLegacyListener(...);
...
}
2. registerLegacyListener 其实就是构造一个 LegacyListener 对象并将其加入 HashMap 中去
private boolean registerLegacyListener(int legacyType, int type,
SensorListener listener, int sensors, int rate)
{
...
legacyListener = new LegacyListener(listener);
mLegacyListenersMap.put(listener, legacyListener); //private HashMap<SensorListener,
LegacyListener> mLegacyListenersMap
...
}
3. LegacyListener 做了 2 件事 一个是调用我们重载的那 2 个接口 还有一个就是将 sensor 的
数据刷到我们的设备显示界面上去
private class LegacyListener implements SensorEventListener {
...
LegacyListener(SensorListener target) {
mTarget = target;
mSensors = 0;
}
public void onSensorChanged(SensorEvent event) {
...
mapSensorDataToWindow();
mTarget.onSensorChanged(...);//private SensorListener mTarget;
...
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
...
}
}
代码最后是一些 native 方法:
private static native void nativeClassInit();//SensorManager 构造函数里调用
private static native int sensors_module_init();//SensorManager 构造函数里调用
private static native int sensors_module_get_next_sensor(Sensor sensor, int
next);//SensorManager 构造函数里调用
// Used within this module from outside SensorManager, don't make private
static native int sensors_data_init();//SensorThread 构造里调用
static native int sensors_data_uninit();//SensorThread 析构里调用
static native int sensors_data_open(FileDescriptor fd); //SensorThread 的 run()循环调用
static native int sensors_data_close();//SensorThread 的 run()循环调用
static native int sensors_data_poll(float[] values, int[] status, long[] timestamp);//SensorThread
的 run()循环调用
SensorManager 与 IsensorService 的关系
SensorManager 调用 IsensorService 其实只是调用了 service 的方法来控制 thread 是 Lock
void startLocked(ISensorService service) {
...
ParcelFileDescriptor fd = service.getDataChanel();
...
}
或者打开
mSensorService.enableSensor(l, name, handle, delay);
IsensorService 的实例是这么获得的
mSensorService = ISensorService.Stub.asInte易做图ce(
ServiceManager.getService(Context.SENSOR_SERVICE));
IsensorService 是通过 aidl 定义的
inte易做图ce ISensorService
{
ParcelFileDescriptor getDataChanel();
boolean enableSensor(IBinder listener, String name, int sensor, int enable);
}
SensorService
frameworks/base/services/java/com/android/server/SensorService.java
class SensorService extends ISensorService.Stub {
...
}
service 最终被 manager 调到走的是 android 的标准流程我们不 care,我们想知道的其实就是
enableSensor 的实现
首先,得有电
if (enable == SENSOR_DISABLE) {
mBatteryStats.noteStopSensor(uid, sensor);
} else {
mBatteryStats.noteStartSensor(uid, sensor);
}
看是不是能打开 sensor
if (enable!=SENSOR_DISABLE && !_sensors_control_activate(sensor, true)) {
Log.w(TAG, "could not enable sensor " + sensor);
return false;
}
如果 sensor 打开了 我们要监听状态还要对外面报告状态变化
if (l == null && enable!=SENSOR_DISABLE) {
l = new Listener(binder);
binder.linkToDeath(l, 0);
mListeners.add(l);
mListeners.notify();
}
如果 sensor 被关闭了 我们要取消监听并且告诉外面关闭了传感
if (enable != SENSOR_DISABLE) {
l.addSensor(sensor, enable);
} else {
l.removeSensor(sensor);
deactivateIfUnused(sensor);
if (l.mSensors == 0) {
mListeners.remove(l);
binder.unlinkToDeath(l, 0);
&n
补充:移动开发 , Android ,