我们先从最上面的应用讲起:
应用如何使用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);
- }
-
-
-
-
- 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());
- }});
- ...........