android-5.0 sensor工作原理—Sensor APP数据的获取

Sensor app开发一般会包含五步:

1. 获取sensor manager对象;
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

2. 获取sensor object;
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

3. 定义eventListener:
mLightSensorListener = new SensorEventListener()
 
4. 注册eventListener;
mSensorManager.registerListener(mLightSensorListener, mLightSensor,
                        LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler);
5. 卸载eventListener;
mSensorManager.unregisterListener(mLightSensorListener);

1. 获取sensor manager对象,getSystemService()实际上是调用registerService()来获得一个sensorManager.

        registerService(SENSOR_SERVICE, new ServiceFetcher() {
                public Object createService(ContextImpl ctx) {
                    return new SystemSensorManager(ctx.getOuterContext(),
                      ctx.mMainThread.getHandler().getLooper());
                }});

 public SystemSensorManager(Context context, Looper mainLooper){
	……
	nativeClassInit();
	……
	i = nativeGetNextSensor(sensor, i);
	……
}

    nativeGetNextSensor()通过SensorManager::getInstance()获取sensorManager对象,通过getSensorList(&sensorList);获取sensorlist。

nativeGetNextSensor(JNIEnv *env, jclass clazz, jobject sensor, jint next){
	SensorManager& mgr(SensorManager::getInstance());
    	Sensor const* const* sensorList;
   	 size_t count = mgr.getSensorList(&sensorList);
	……
}

getSensorList()通过sensorManager的构造方法assertStateLocked()来获取sensorService对象,assertStateLocked()同时会调用sensorService::getSensorList()来获取最终的sensorList,也就是前面sensorService启动时所获得了sensorList.


ssize_t SensorManager::getSensorList(Sensor const* const** list) const
{
    Mutex::Autolock _l(mLock);
    status_t err = assertStateLocked();
    if (err < 0) {
        return ssize_t(err);
    }
    *list = mSensorList;
    return mSensors.size();
}

status_t SensorManager::assertStateLocked() const {
    if (mSensorServer == NULL) {
        // try for one second
        const String16 name("sensorservice");
        for (int i=0 ; i<4 ; i++) {
            status_t err = getService(name, &mSensorServer);
            if (err == NAME_NOT_FOUND) {
                usleep(250000);
                continue;
            }
            if (err != NO_ERROR) {
               
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值