SystemSensorManager启动

转载:http://blog.csdn.net/new_abc/article/details/8971883


SystemSensorManager是sensor Java层的一个service。

我们看一下其启动的流程图:


其启动在ContextImpl.java中

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

registerService把new的一个ServiceFetcher添加到SYSTEM_SERVICE_MAP

  1. private static void registerService(String serviceName, ServiceFetcher fetcher) {  
  2.        if (!(fetcher instanceof StaticServiceFetcher)) {  
  3.            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;  
  4.        }  
  5.        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);  
  6.    }  

当我们调用getSystemService获取“sensor” service时

  1. public Object getSystemService(String name) {  
  2.        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);  
  3.        return fetcher == null ? null : fetcher.getService(this);  

看下getService

  1. public Object getService(ContextImpl ctx) {  
  2.            ArrayList<Object> cache = ctx.mServiceCache;  
  3.            Object service;  
  4.            synchronized (cache) {  
  5.                if (cache.size() == 0) {  
  6.                    // Initialize the cache vector on first access.  
  7.                    // At this point sNextPerContextServiceCacheIndex  
  8.                    // is the number of potential services that are  
  9.                    // cached per-Context.  
  10.                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {  
  11.                        cache.add(null);  
  12.                    }  
  13.                } else {  
  14.                    service = cache.get(mContextCacheIndex);  
  15.                    if (service != null) {  
  16.                        return service;  
  17.                    }  
  18.                }  
  19.                service = createService(ctx);  
  20.                cache.set(mContextCacheIndex, service);  
  21.                return service;  
  22.            }  
  23.        }  

如果service不存在,则调用createService就是我们上面在registerservice时重载的createService方法,里面就是new 了一个SystemSensorManager

我们看下SystemSensorManager的启动

  1. public SystemSensorManager(Looper mainLooper) {  
  2.         mMainLooper = mainLooper;  
  3.   
  4.         synchronized(sListeners) {  
  5.             if (!sSensorModuleInitialized) {  
  6.                 sSensorModuleInitialized = true;  
  7.   
  8.                 nativeClassInit();  
  9.   
  10.                 // initialize the sensor list  
  11.                 sensors_module_init();//启动C++层的SensorManager  
  12.                 final ArrayList<Sensor> fullList = sFullSensorsList;  
  13.                 int i = 0;  
  14.                 do {  
  15.                     Sensor sensor = new Sensor();  
  16.                     i = sensors_module_get_next_sensor(sensor, i);//获取所有的sensor  
  17.   
  18.                     if (i>=0) {  
  19.                         //Log.d(TAG, "found sensor: " + sensor.getName() +  
  20.                         //        ", handle=" + sensor.getHandle());  
  21.                         fullList.add(sensor);  
  22.                         sHandleToSensor.append(sensor.getHandle(), sensor);  
  23.                     }  
  24.                 } while (i>0);  
  25.   
  26.                 sPool = new SensorEventPool( sFullSensorsList.size()*2 );  
  27.                 sSensorThread = new SensorThread();//创建一个sensor线程  
  28.             }  
  29.         }  
  30.     }  

我们看一下sensors_module_init(这里已经到c++层)

  1. static jint  
  2. sensors_module_init(JNIEnv *env, jclass clazz)  
  3. {  
  4.     SensorManager::getInstance();  
  5.     return 0;  
  6. }  

获取一个SensorManager

  1. SensorManager::SensorManager()  
  2.     : mSensorList(0)  
  3. {  
  4.     // okay we're not locked here, but it's not needed during construction  
  5.     assertStateLocked();  
  6. }  
  7.   
  8.   
  9. status_t SensorManager::assertStateLocked() const {  
  10.     if (mSensorServer == NULL) {  
  11.         // try for one second  
  12.         const String16 name("sensorservice");  
  13.         for (int i=0 ; i<4 ; i++) {  
  14.             status_t err = getService(name, &mSensorServer);  
  15.             if (err == NAME_NOT_FOUND) {  
  16.                 usleep(250000);  
  17.                 continue;  
  18.             }  
  19.             if (err != NO_ERROR) {  
  20.                 return err;  
  21.             }  
  22.             break;  
  23.         }  
  24.   
  25.         class DeathObserver : public IBinder::DeathRecipient {  
  26.             SensorManager& mSensorManger;  
  27.             virtual void binderDied(const wp<IBinder>& who) {  
  28.                 ALOGW("sensorservice died [%p]", who.unsafe_get());  
  29.                 mSensorManger.sensorManagerDied();  
  30.             }  
  31.         public:  
  32.             DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }  
  33.         };  
  34.   
  35.         mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));  
  36.         mSensorServer->asBinder()->linkToDeath(mDeathObserver);  
  37.   
  38.         mSensors = mSensorServer->getSensorList();  
  39.         size_t count = mSensors.size();  
  40.         mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));  
  41.         for (size_t i=0 ; i<count ; i++) {  
  42.             mSensorList[i] = mSensors.array() + i;  
  43.         }  
  44.     }  
  45.   
  46.     return NO_ERROR;  
  47. }  

assertStateLocked首先获取sensorservice,然后定义一个内部类DeathObserver,用来监听sensorservice异常退出情况,然后通过ISensorServer的接口getSensorList获取系统中存在的sensor

启动完C++层的sensormanager后,SystemSensorManager 中调用sensors_module_get_next_sensor获取所所有的sensor, jni层的sensors_module_get_next_sensor其实就是获取前面mSensorList里面获取的。

到这里,SystemSensorManager就已经启动了,主要是启动了C++层的SensorManager

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值