Android 浅谈Sensor工作流程(一)

来源:互联网 发布:美的集团社会关系网络 编辑:程序博客网 时间:2024/05/01 19:22

转自http://www.apkbus.com/android-14019-1-1.html
我们使用 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:

java代码:
  1. public boolean registerListener(SensorListener listener, int sensors, int rate) {
  2. result = registerLegacyListener(...);
  3. }
复制代码
2. registerLegacyListener 其实就是构造一个 LegacyListener 对象并将其加入 HashMap 中去

java代码:
  1. private boolean registerLegacyListener(int legacyType, int type,
  2. SensorListener listener, int sensors, int rate)
  3. {

  4. legacyListener = new LegacyListener(listener);
  5. mLegacyListenersMap.put(listener, legacyListener); //private HashMap< p>
  6. LegacyListener> mLegacyListenersMap
  7. }
复制代码
  3. LegacyListener 做了 2 件事 一个是调用我们重载的那 2 个接口 还有一个就是将 sensor 的数据刷到我们的设备显示界面上去

java代码:
  1. private class LegacyListener implements SensorEventListener {

  2. LegacyListener(SensorListener target) {

  3. mTarget = target;
  4. mSensors = 0;
  5. }

  6. public void onSensorChanged(SensorEvent event) {
  7. mapSensorDataToWindow();
  8. mTarget.onSensorChanged(...);//private SensorListener mTarget;
  9. }

  10. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  11. }

  12. }
复制代码
   代码最后是一些 native 方法:

java代码:
  1. private static native void nativeClassInit();//SensorManager 构造函数里调用
  2. private static native int sensors_module_init();//SensorManager 构造函数里调用
  3. private static native int sensors_module_get_next_sensor(Sensor sensor, intnext);
  4. //SensorManager 构造函数里调用
  5. // Used within this module from outside SensorManager, don't make private

  6. static native int sensors_data_init();//SensorThread 构造里调用
  7. static native int sensors_data_uninit();//SensorThread 析构里调用
  8. static native int sensors_data_open(FileDescriptor fd); //SensorThread 的 run()循环调用
  9. static native int sensors_data_close();//SensorThread 的 run()循环调用
  10. static native int sensors_data_poll(float[] values, int[] status, long[] timestamp);
  11. //SensorThread的run()循环调用

  12. //SensorManager 与 IsensorService 的关系
  13. //SensorManager 调用 IsensorService 其实只是调用了 service 的方法来控制 thread 是 Lock

  14. void startLocked(ISensorService service) {
  15. ParcelFileDescriptor fd = service.getDataChanel();
  16. }
复制代码
或者打开  mSensorService.enableSensor(l, name, handle, delay);
  IsensorService 的实例是这么获得的
  mSensorService = ISensorService.Stub.asInterface(
  ServiceManager.getService(Context.SENSOR_SERVICE));
  IsensorService 是通过 aidl 定义的

java代码:
  1. interface ISensorService{

  2. ParcelFileDescriptor getDataChanel();
  3. boolean enableSensor(IBinder listener, String name, int sensor, int enable);
  4. }

  5. SensorService
  6. class SensorService extends ISensorService.Stub {
  7. }
复制代码
service 最终被 manager 调到走的是 android 的标准流程我们不 care,我们想知道的其实就是enableSensor 的实现

java代码:
  1. if (enable == SENSOR_DISABLE) {
  2. mBatteryStats.noteStopSensor(uid, sensor);
  3. } else {

  4. mBatteryStats.noteStartSensor(uid, sensor);
  5. }

  6. //看是不是能打开 sensor

  7. if (enable!=SENSOR_DISABLE && !_sensors_control_activate(sensor, true)) {
  8. Log.w(TAG, "could not enable sensor " + sensor);
  9. return false;
  10. }

  11. //如果 sensor 打开了 我们要监听状态还要对外面报告状态变化

  12. if (l == null && enable!=SENSOR_DISABLE) {
  13. l = new Listener(binder);
  14. binder.linkToDeath(l, 0);
  15. mListeners.add(l);
  16. mListeners.notify();
  17. }

  18. //如果 sensor 被关闭了 我们要取消监听并且告诉外面关闭了传感
  19. if (enable != SENSOR_DISABLE) {
  20. l.addSensor(sensor, enable);
  21. } else {
  22. l.removeSensor(sensor);
  23. deactivateIfUnused(sensor);
  24. if (l.mSensors == 0) {
  25. mListeners.remove(l);
  26. binder.unlinkToDeath(l, 0);
  27. mListeners.notify();
  28. }

  29. }
复制代码
原创粉丝点击