我们先从最上面的应用讲起:
应用如何使用sensor的数据呢:
一、应用使用sensor
可以在应用中自己写一个SensorEventListener,然后注册到SensorManager中,注册的时候可以选择哪个sensor,然后也可以自己指定handler,防止在主线程中卡死。
private void registerListener() {
SensorManager sm = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
sm.registerListener(mSensorListener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (Sensor.TYPE_ACCELEROMETER == event.sensor.getType()) {
............
二、SensorManager
我们先来看应用是如何获取到SensorManager的,下面这段代码是在ContextImpl.java中,这个文件时Context类的实现类。
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
再看下面可以知道,SensorManager是SystemSensorManager类。
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>();
private static int sNextPerContextServiceCacheIndex = 0;
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
// This one's defined separately and given a variable name so it
// can be re-used by getWallpaperManager(), avoiding a HashMap
// lookup.
private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new WallpaperManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler());
}};
static {
...........
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper());
}});
...........