金库LG网官网登录网址:Android的系统移植与平台开发Sensor HAL框架分析2

1.1Sensor利用法度榜样框架这部分对付上层写利用的同伙来对照认识,我们经由过程一个简单的利用来阐发框架层和底层的实现。平日编写一个传感器的利用法度榜样有以下步骤:l经由过程调用Context.getSystemService(SENSOR_S




1.1 Sensor利用法度榜样框架

这部分对付上层写利用的同伙来对照认识,我们经由过程一个简单的利用来阐发框架层和底层的实现。

平日编写一个传感器的利用法度榜样有以下步骤:

l 经由过程调用 Context.getSystemService(SENSOR_SERVICE)得到传感器办事,实现返回的是封装了SensorService的SensorManager工具

l 调用SensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)来得到指定类型的传感器工具,方便得到传感器的数据

l 经由过程SensorManager.registerListener注册SensorEventListener监听器,监听得到的传感器工具,当传感器数据提交上来时,能被利用法度榜样获得

l 实现监听器里传感器上报数据的详细操作

由编写利用法度榜样的步骤可知,所有法度榜样的操作都和SensorManager有关。在开始阐发详细实现之前我们先来谈谈SensorManager观点。

1) Android Manager机制

Manager中文直译是处置惩罚者,经理,治理人,总而言之,管事的人。用我的话说便是:有权有钱,屁事不干,辅导江山,NB朝天。在Android的办事框架里Manager被安排作为经理人、引导,它认真自己统领区的所有操作。类似于公司里的行政部门,它是一个纯挚非盈利办事部门,行政部门经理自己从来不干活,每天批示别人干这干那,假如其它部门要想应用行政部门的办事,先要向行政经理提申请,申请经由过程了,安排详细职员为你办事。我们阐发的是Sensor办事,Sensor办事用户法度榜样不能直接造访,要经由过程SensorManager来造访,也便是说SensorManager是SensorService供给办事接口的封装。

平日在Android的Manager里都邑掩护对其治理Service的引用,用户法度榜样提出Service操作申请,Manager将操作申请交由其治理的Service处置惩罚,然后将处置惩罚结果再交给用户法度榜样或回调用户注册的监听接口。

总结:

1) Manager是利用法度榜样直接面对的接口

2) Manager里掩护对应的Service

3) 利用法金库LG网官网登录网址度榜样不能直接造访Service

为什么要这么设计??

应用Manager机制的好处是显而易见的:

l Service是办事,办事是所有利用共享,不能属于某一个详细的进程,即:Android法度榜样。

l 基于第一点,Android利用与Service在不合进程,它们之间一定要进行通信,要应用IPC,即:进程间通信,而框架的感化是让利用法度榜样快速开拓供给API,弗成能让进程间通信的代码呈现在Android利用中,这些所谓的后台操作不能让法度榜样开拓者感知到,即:暗藏通信手段与细节。

既然如斯,那Google就给我们写一个Manager类,把共享办事暗藏起来,只裸露操作接口,操作细节,IPC细节一切后台去。

OK,理解了这个,可以看得出来,我们的之前写的LedHAL是如斯的弱智,如斯的没有规范,如斯的不斟酌框架设计,如斯的不复用代码,如斯…,太多了,没有法子,逐步在后面再优化吧,差不多了,开始吧。

前面说了,应用Sensor办事要用SensorManager,让我们来看看一个简单利用的代码,再徐徐展开。

public class SensorAppDemoActivity extends Activity implementsSensorEventListener{

private TextViewmTextView;

/** Calledwhen the activ金库LG网官网登录网址ity is first created. */

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mTextView= (TextView) findViewById(R.id.mTextView);

// 获得SensorManager

SensorManager sm = (SensorManager)this.getSystemService(SENSOR_SERVICE);

// 得到指定类型的传感器工具

SensortempSensor = sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE);

// 注册传感器工具的监听器

sm.registerListener(this, tempSensor, SensorManager.SENSOR_DELAY_NORMAL);

}

@Override

public voidonAccuracyChanged(Sensor sensor, int accuracy) {

// TODOAuto-generated method stub

// 未实现该措金库LG网官网登录网址施

}

@Override

public void onSensorChanged(SensorEvent event) {

// TODOAuto-generated method stub

mTextView.setText("Currenttemperature is :" + event.values[0]);

}

}

上面代码很简单,获得温度传感器工具后,注册传感器事故监听器,当数据变更时在Activity上的TextView上显示温度。

现在我们阐发每个步骤框架的实现:

先来看Context.getSystemService(SENSOR_SERVICE)。

2) 得到Sensor系统办事

上面代码里getSystemService(String)是在当前Activity里直接调用的,阐明它不是Activity的措施便是其父类的措施,按照承袭关系向上查找:

@frameworks/base/core/java/android/app/ContextImpl.java

@Override

public Object getSystemService(String name) {

ServiceFetcherfetcher = SYSTEM_SERVICE_MAP.get(name);

returnfetcher == null ? null : fetcher.getService(this);

}

这是什么?我恨Android新版本的代码,没有老版本的看着简单。先来看下SYSTEM_SERVICE_MAP是什么器械,看样子像映射关系:

private static final HashMap SYSTEM_SERVICE_MAP =

newHashMap();

SYSTEM_SERVICE_MAP着实是一个哈希键值映射表,其Key为String类型,Value为ServiceFetcher类型,而我们得到办事时经由过程办事名来查找一个ServiceFetcher类型,并返回ServiceFetcher.getService()的结果作为SensorManager。

static class ServiceFetcher {

intmContextCacheIndex = -1;

publicObject getService(ContextImpl ctx) {

// mServiceCache是ArrayList类型工具

ArrayList cache =ctx.mServiceCache;

Object service;

synchronized (cache) {

// 对付新创建的Activity mServiceCache里没有元素,以是size为0

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.

// sNextPerContextServiceCacheIndex为每个Android办事的索引值

for (int i = 0; i 工具,其里面保存着所有注册的Service工具,并且Service工具的得到和创建由ServiceFether来封装,该类就两个措施:createService和getService,而createService是未实现的措施。createSerive的实现在后面:

private static int sNextPerContextServiceCacheIndex =0;

private static void registerService(String serviceName, ServiceFetcher fetcher){

if(!(fetcher instanceof StaticServiceFetcher)) { //是否为StaticServiceFetcher的工具

fetcher.mContextCacheIndex =sNextPerContextServiceCacheIndex++;

}

SYSTEM_SERVICE_MAP.put(serviceName, fetcher); // 添加到SYSTEM_SERVICE_MAP键值表里

}

static {

registerService(POWER_SERVICE, new ServiceFetcher() {

public Object createService(ContextI金库LG网官网登录网址mpl ctx) {

IBinder b = ServiceManager.getService(POWER_SERVICE);

IPowerManager service = IPowerManager.Stub.asInterface(b);

return new PowerManager(service, ctx.mMainThread.getHandler());

}});

registerService (SENSOR_SERVICE,new ServiceFetcher() {

public Object createService(ContextImpl ctx) {

return new SensorManager(ctx.mMainThread.getHandler().getLooper());

}});

}

好家伙,一会儿在静态初始化语句块里经由过程私有措施registerService注册了30多个办事,其第二个参数为ServiceFetcher类型,每个注册的办事都是匿名内部类,都实现了createService措施,在createService措施里创建了SensorManager工具,该工具和Activity的Looper共享消息行列步金库LG网官网登录网址队。

总结下吧:

用户法度榜样调用getSystemService(SENSOR_SERVICE),着实现在ContextImpl.java中,在着实实现中从SYSTEM_SERVICE_MAP键值表查找与SENSOR_SERVICE键对应的工具ServiceFetcher,调用ServiceFetcher.getService措施获得SensorManager工具,而ContextImpl工具里还掩护着一个ServiceCache,假如某个办事被get过一次,就会被记录在这个所谓缓存里,ServiceFetcher.getService先查找缓存里有没有Cache的Object,假如没有,则调用自己的createService措施创建这个Object,而createService没有实现,其在registerService注册办事时创建ServiceFetcher匿名内部类时实现,并且将注册的办事添加到SYSTEM_SERVICE_MAP中,在创建SensorManager工具时,它和Activity共享了一个Looper。

总而言之,言而总之,在getSystemService(SENSOR_SERVICE)里,创建了SensorManager工具并且和Activity共享Looper。

转自:http://blog.csdn.net/mr_raptor/article/details/8090508

发表评论
加载中...

相关文章