转载:http://blog.csdn.net/new_abc/article/details/8971883
SystemSensorManager是sensor Java层的一个service。
我们看一下其启动的流程图:
其启动在ContextImpl.java中
- registerService(SENSOR_SERVICE, new ServiceFetcher() {
- public Object createService(ContextImpl ctx) {
- return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper());
- }});
registerService把new的一个ServiceFetcher添加到SYSTEM_SERVICE_MAP
- private static void registerService(String serviceName, ServiceFetcher fetcher) {
- if (!(fetcher instanceof StaticServiceFetcher)) {
- fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
- }
- SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
- }
当我们调用getSystemService获取“sensor” service时
- public Object getSystemService(String name) {
- ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
- return fetcher == null ? null : fetcher.getService(this);
看下getService
- public Object getService(ContextImpl ctx) {
- ArrayList<Object> cache = ctx.mServiceCache;
- Object service;
- synchronized (cache) {
- if (cache.size() == 0) {
- // Initialize the cache vector on first access.
- // At this point sNextPerContextServiceCacheIndex
- // is the number of potential services that are
- // cached per-Context.
- for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
- cache.add(null);
- }
- } else {
- service = cache.get(mContextCacheIndex);
- if (service != null) {
- return service;
- }
- }
- service = createService(ctx);
- cache.set(mContextCacheIndex, service);
- return service;
- }
- }
如果service不存在,则调用createService就是我们上面在registerservice时重载的createService方法,里面就是new 了一个SystemSensorManager
我们看下SystemSensorManager的启动
- public SystemSensorManager(Looper mainLooper) {
- mMainLooper = mainLooper;
- synchronized(sListeners) {
- if (!sSensorModuleInitialized) {
- sSensorModuleInitialized = true;
- nativeClassInit();
- // initialize the sensor list
- sensors_module_init();//启动C++层的SensorManager
- final ArrayList<Sensor> fullList = sFullSensorsList;
- int i = 0;
- do {
- Sensor sensor = new Sensor();
- i = sensors_module_get_next_sensor(sensor, i);//获取所有的sensor
- if (i>=0) {
- //Log.d(TAG, "found sensor: " + sensor.getName() +
- // ", handle=" + sensor.getHandle());
- fullList.add(sensor);
- sHandleToSensor.append(sensor.getHandle(), sensor);
- }
- } while (i>0);
- sPool = new SensorEventPool( sFullSensorsList.size()*2 );
- sSensorThread = new SensorThread();//创建一个sensor线程
- }
- }
- }
我们看一下sensors_module_init(这里已经到c++层)
- static jint
- sensors_module_init(JNIEnv *env, jclass clazz)
- {
- SensorManager::getInstance();
- return 0;
- }
获取一个SensorManager
- SensorManager::SensorManager()
- : mSensorList(0)
- {
- // okay we're not locked here, but it's not needed during construction
- assertStateLocked();
- }
- 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) {
- return err;
- }
- break;
- }
- class DeathObserver : public IBinder::DeathRecipient {
- SensorManager& mSensorManger;
- virtual void binderDied(const wp<IBinder>& who) {
- ALOGW("sensorservice died [%p]", who.unsafe_get());
- mSensorManger.sensorManagerDied();
- }
- public:
- DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
- };
- mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
- mSensorServer->asBinder()->linkToDeath(mDeathObserver);
- mSensors = mSensorServer->getSensorList();
- size_t count = mSensors.size();
- mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));
- for (size_t i=0 ; i<count ; i++) {
- mSensorList[i] = mSensors.array() + i;
- }
- }
- return NO_ERROR;
- }
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