Android Sensor框架简述(三)
来源:互联网 发布:淘宝众筹怎么进 编辑:程序博客网 时间:2024/05/01 14:27
在上一章Android Sensor框架简述(二) 中,我们最后介绍了应用层获取HAL层上报数据的方式。然而内部的实现逻辑并没有理清楚,现在,看看sensorManager是如何实现监听数据的。
获取sensor manager对象
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
这是获取sensorManager
的语句,getSystemService
方法实际上调用了registerService
来获得一个SystemSensorManager
的对象
registerService(SENSOR_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new SystemSensorManager(ctx.getOuterContext(), ctx.mMainThread.getHandler().getLooper()); }});
SystemSensorManager对象的构造函数使用了JNI的方式获取了一个SensorManager::getInstance()
获取了SensorManager的一个单例,并调用了getSensorList
的方法,到最终调用了sensorService的的getSensorList
方法。
Vector<Sensor> SensorService::getSensorList(){ char value[PROPERTY_VALUE_MAX]; property_get("debug.sensors", value, "0"); if (atoi(value)) { return mUserSensorListDebug; } return mUserSensorList;}
获取sensor object
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
getDefaultSensor
调用了getSensorList(type)
获取指定type的sensor.
/** * Use this method to get the list of available sensors of a certain type. * Make multiple calls to get sensors of different types or use * {@link android.hardware.Sensor#TYPE_ALL Sensor.TYPE_ALL} to get all the * sensors. * * @param type * of sensors requested * * @return a list of sensors matching the asked type. * * @see #getDefaultSensor(int) * @see Sensor */ public List<Sensor> getSensorList(int type) { // cache the returned lists the first time List<Sensor> list; final List<Sensor> fullList = getFullSensorList(); synchronized (mSensorListByType) { list = mSensorListByType.get(type); if (list == null) { if (type == Sensor.TYPE_ALL) { list = fullList; } else { list = new ArrayList<Sensor>(); for (Sensor i : fullList) { if (i.getType() == type) list.add(i); } } list = Collections.unmodifiableList(list); mSensorListByType.append(type, list); } } return list; }
定义eventListener
mLightSensorListener = new SensorEventListener();
这个定义主要是重写了onSensorChanged()
和onAccuracyChanged()
方法,这两个分别是在传感器的数据和精度发生变化的时候进行处理的监听器,代码不再贴。
注册eventListener
sensorManager.registerListener(this,gyroscopeSensor,10000);
registerListener
调用systemSensorManager
的registerListenerImpl()
方法,主要是定义了消息泵Looper,消息队列sensorEventQueue。Looper的实现也是JNI的方式,绑定了一个回调函数handleEvent
,再调用了dispatchSensorEvent
方法。
在dispatchSensorEvent
的最后,我们看到了mListener.onSensorChanged(t);
,调用该函数做处理。
PS:由于内核代码涉及到机密,部分自定义的代码不贴出来了,源码可以在Google找到。
写在最后的
博主负责的部分不是上层,所以有些机制很能非常深入了解。SensorManager获取数据的大概方式就是如此了。HAL负责数据的上报,SensorManager负责接收给应用使用,中间可以对传感器数据进行处理,滤波,校准等等。
- Android Sensor框架简述(三)
- Android Sensor框架简述(一)
- Android Sensor框架简述(二)
- Android Sensor感应器介绍(三)Sensor类介绍
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三
- Android Sensor底层框架
- Android Sensor 框架
- Android传感器---Motion Sensor(三)
- Android传感器---Motion Sensor(三)
- android sensor 框架分析---sensor数据流分析
- android sensor 框架分析---sensor native分析
- android sensor 框架分析---sensor 总结
- Ubuntu下获取内核源码
- 九度OJ 1062 分段函数
- Django中间件
- java设计模式——备忘录
- PHP的编码规范
- Android Sensor框架简述(三)
- (转)首字母大/小写
- Mysql 5.7.* 免安装版配置
- selenium+python学习之旅
- 文章标题
- Redis常用命令
- Java项目JUnit简单使用
- 注册表详解
- 抽象(abstract)类