转载来自:http://m.blog.csdn.net/blog/yaowei514473839/39530167
Android4.4的传感器对象初始化流程。
Step 1、首先经过frameworks\base\core\java\android\app\ContextImpl.java中的下面的静态方法注册传感器服务。
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper());
}});
其中registerService的实现如下:
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher); //以服务名为键值,将ServiceFetcher保存在SYSTEM_SERVICE_MAP中
}
Step 2、new SystemSensorManager
该代码位于SystemSensorManager.java中。
public SystemSensorManager(Context context, Looper mainLooper) {
mMainLooper = mainLooper;
mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
synchronized(sSensorModuleLock) {
if (!sSensorModuleInitialized) {
sSensorModuleInitialized = true;
nativeClassInit();
// initialize the sensor list
final ArrayList<Sensor> fullList = sFullSensorsList</span>;
int i = 0;
do {
Sensor sensor = new Sensor(); //创建一个Sensor对象
i = nativeGetNextSensor(sensor, i);
if (i>=0) {
//Log.d(TAG, "found sensor: " + sensor.getName() +
// ", handle=" + sensor.getHandle());
fullList</span>.add(sensor);//加入Sensor列表
sHandleToSensor.append(sensor.getHandle(), sensor);
}
} while (i>0);
}
}
}
上段代码中的do....while循环后,完成获取所有Sensor的工作,将它们存储在SystemSensorManager中的成员变量sFullSensorsList中。
Step 3、new Sensor代码位于Sensor.java中。
Step 4、nativeGetNextSensor
代码位于android_hardware_SensorManager.cpp中。
static jint
nativeGetNextSensor(JNIEnv *env, jclass clazz, jobject sensor, jint next)
{
SensorManager& mgr(SensorManager::getInstance());//创建SensorManager对象
Sensor const* const* sensorList;
size_t count = mgr.getSensorList(&sensorList);
if (size_t(next) >= count)
return -1;
Sensor const* const list = sensorList[next];
const SensorOffsets& sensorOffsets(gSensorOffsets);
jstring name = env->NewStringUTF(list->getName().string());
jstring vendor = env->NewStringUTF(list->getVendor().string());
env->SetObjectField(sensor, sensorOffsets.name, name);
env->SetObjectField(sensor, sensorOffsets.vendor, vendor);
env->SetIntField(sensor, sensorOffsets.version, list->getVersion());
env->SetIntField(sensor, sensorOffsets.handle, list->getHandle());
env->SetIntField(sensor, sensorOffsets.type, list->getType());
env->SetFloatField(sensor, sensorOffsets.range, list->getMaxValue());
env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution());
env->SetFloatField(sensor, sensorOffsets.power, list->getPowerUsage());
env->SetIntField(sensor, sensorOffsets.minDelay, list->getMinDelay());
env->SetIntField(sensor, sensorOffsets.fifoReservedEventCount,
list->getFifoReservedEventCount());
env->SetIntField(sensor, sensorOffsets.fifoMaxEventCount, list->getFifoMaxEventCount());
next++;
return size_t(next) < count ? next : 0;
}
Step 5、SensorManager()
代码位于SensorManager.cpp中。
SensorManager::SensorManager()
: mSensorList(0)
{
// okay we're not locked here, but it's not needed during construction
assertStateLocked();
}
Step 6、asserStateLocked()
代码位于SensorManager.cpp中。
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);//获取ISensorService接口SensorService
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);//创建一个DeathObserver来监听SensorService异常退出
mSensors = mSensorServer->getSensorList();//通过ISensorServer接口获取传感器列表,实为SystemSensorManager的sFullSensorsList
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;//即为mSensors
}
}
return NO_ERROR;
}
至此,SystemSensorManager启动完成,Sensor对象完成初始化过程。