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.asInterface(
                       ServiceManager.getService(Context.SENSOR_SERVICE));
IsensorService 是通过 aidl 定义的
interface 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);
                             mListeners.notify();
                       }
                  }
另外还有一些唤醒和设置延迟的动作
if (mListeners.size() == 0) {
                       _sensors_control_wake();
                  }
   if (minDelay >= 0) {
                       _sensors_control_set_delay(minDelay);
                  }
从上面可以看出来 对于底层而言只要知道上层怎么调用传感的接口就好 所以最关心的还是
我标绿的 native 方法 上层的传感流程其实比较简单 就是标准的 service 管理和 notify 流程
      private static native int _sensors_control_init();
       private static native ParcelFileDescriptor _sensors_control_open();
       private static native boolean _sensors_control_activate(int sensor, boolean activate);
       private static native int _sensors_control_set_delay(int ms);
       private static native int _sensors_control_wake();
native 方法
1. manager 部分
frameworks/base/core/jni/android_hardware_SensorManager.cpp
先看一眼它的方法注册
static JNINativeMethod gMethods[] = {
       {"nativeClassInit", "()V",          (void*)nativeClassInit },
       {"sensors_module_init","()I",          (void*)sensors_module_init },
       {"sensors_module_get_next_sensor","(Landroid/hardware/Sensor;I)I",
                                                           (void*)sensors_module_get_next_sensor },
       {"sensors_data_init", "()I",         (void*)sensors_data_init },
       {"sensors_data_uninit", "()I",        (void*)sensors_data_uninit },
       {"sensors_data_open", "(Ljava/io/FileDescriptor;)I", (void*)sensors_data_open },
       {"sensors_data_close", "()I",         (void*)sensors_data_close },
       {"sensors_data_poll", "([F[I[J)I", (void*)sensors_data_poll },
};
小贴一个例子作为代表
static jint
sensors_data_open(JNIEnv *env, jclass clazz, jobject fdo)
{
       jclass FileDescriptor = env->FindClass("java/io/FileDescriptor");
       jfieldID offset = env->GetFieldID(FileDescriptor, "descriptor", "I");
       int fd = env->GetIntField(fdo, offset);
       return sSensorDevice->data_open(sSensorDevice, fd); // doesn't take ownership of fd
}
调用到最后其实都是用的 sSensorDevice 的方法
/*
   * The method below are not thread-safe and not intended to be
   */
static sensors_data_device_t* sSensorDevice = 0;
2.service 部分
frameworks/base/services/jni/com_android_server_SensorService.cpp
先看一眼它的方法注册
static JNINativeMethod gMethods[] = {
       {"_sensors_control_init", "()I", (void*) android_init },
       {"_sensors_control_open", "()Landroid/os/ParcelFileDescriptor;", (void*) android_open },
       {"_sensors_control_activate", "(IZ)Z", (void*) android_activate },
      {"_sensors_control_wake", "()I", (void*) android_data_wake },
      {"_sensors_control_set_delay","(I)I", (void*) android_set_delay },
};
然后上面的那些方法我就不一一贴了 给出一个例子 其实这么实现的
static jboolean      盛世游戏:http://www.shengshiyouxi.com
android_activate(JNIEnv *env, jclass clazz, jint sensor, jboolean activate)
{
      int active = sSensorDevice->activate(sSensorDevice, sensor, activate);
      return (active<0) ? false : true;
}
所以最后调用的其实都是 sSensorDevice 的方法 其他的几个也是这样 sSensorDevice 是这个
(不是线程安全的)
/*
* The method below are not thread-safe and not intended to be
*/
static sensors_control_device_t* sSensorDevice = 0;
3.继续追 终于到了硬件层了 最后一切的方法其实就在这里了
hardware/libhardware/include/hardware/sensor.h
struct sensors_control_device_t {

android中Sensor 工作流程的更多相关文章

  1. zigbee学习:示例程序SampleApp中按键工作流程

    zigbee学习:示例程序SampleApp中按键工作流程 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:IAR8. ...

  2. Android中G-Sensor相关流程

    1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...

  3. Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

    转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

  4. Android中View绘制流程以及invalidate()等相关方法分析(转)

    转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

  5. Android中View绘制流程以及invalidate()等相关方法分析

    [原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...

  6. 【转载】Android 中 View 绘制流程分析

    创建Window 在Activity的attach方法中通过调用PolicyManager.makeNewWindo创建Window,将一个View add到WindowManager时,Window ...

  7. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  8. android中的事件传递和处理机制

    一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己 ...

  9. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明

    今天给大家介绍下Android中滑屏功能的一个基本实现过程以及原理初探,最后给大家重点讲解View视图中scrollTo 与 scrollBy这两个函数的区别 . 首先 ,我们必须明白在Android ...

随机推荐

  1. (08)DBA写给开发的索引经验

          索引可是个大事情,翻开任意一本数据库调优的书,索引都会占到比较大的篇幅.这是个人人都很重视的问题,可往往起始阶段还好,但数据库到最后常常还是会陷入由索引起的性能怪圈中.特别是在上线运行过一 ...

  2. 你以为在用SharePoint但事实上不是

    博客地址 http://blog.csdn.net/foxdave 原文链接:http://www.techrepublic.com/blog/tech-decision-maker/you-thin ...

  3. CSS中的几个概念--------Day39

    世界杯疯狂来袭,让这个原本就高温的夏季瞬间被引爆了,这肆虐的激情仿佛让一切都灼热了起来,绽放着刺目的光,工作之余总有那么一群人在那激烈的讨论着争辩着,抑不住的亢奋. 非常不巧,往往这群身影中总有我的存 ...

  4. View实现涂鸦、撤销以及重做功能

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  5. Flexigrid去掉列选择

    Flexigrid中会出现列选择的小黑箭头,有时挺讨厌,想去掉.发现没有控制的地方,于是自己加. 在flexigrid.js中增加 在定义中增加 p = $.extend({ //apply defa ...

  6. [Machine Learning (Andrew NG courses)]IV.Linear Regression with Multiple Variables

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenFoXzE5OTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  7. EFI/GPT探索(为何win7分区时创建100M隐藏分区)

    EFI/GPT探索(为何win7分区时创建100M隐藏分区) 转自 http://blog.tomatoit.net/article.asp?id=348 EFI/GPT是新一代的固件/启动管理技术, ...

  8. OpenRisc-30-SD card controller模块分析与验证

    引言 ORPSoC的硬件平台是包含SD card controller控制器的,但是对应的linux里面却没有对应的linux的驱动程序,这使ORPSoC的SD card的使用收到了很大的限制.没有驱 ...

  9. Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good

    引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...

  10. Richard Stallman与洪峰谈黑客道培训实录_业界_科技时代_新浪网

    Richard Stallman与洪峰谈黑客道培训实录_业界_科技时代_新浪网 Richard Stallman与洪峰谈黑客道培训实录