Sensor框架Framework层解读 - 图文(5)

2019-08-30 22:56

添加到了系统服务管理中,客户端可以通过defaultServiceManager:getService()获取到Sensor服务的实例。

继承BnSensorServer这个是sensor服务抽象接口类提供给客户端调用:

class Sensor;

class ISensorEventConnection;

class ISensorServer : public IInterface {

public:

DECLARE_META_INTERFACE(SensorServer); //获取Sensor列表

virtual Vector getSensorList() = 0;

//创建一个连接的接口,这些都是提供给客户端的抽象接口,服务端实例化时候必须实现

virtual sp createSensorEventConnection() = 0;

};

class BnSensorServer : public BnInterface {

public:

//传输打包数据的通讯接口,在BnSensorServer被实现 virtual status_t onTransact( uint32_t code,

const Parcel& data, Parcel* reply,

uint32_t flags = 0); };

}; // namespace android

View Code

ISensorServer接口提供了两个抽象方法给客户端调用,关键在于

createSensorEventConnection()方法,该在服务端被实现,在客户端被调用,并返回一个

SensorEventConnection的实例,创建连接,客户端拿到SensorEventConnection实例之后,可以对sensor进行通信操作,仅仅作为通信的接口而已,它并没有用来传送Sensor数据,因为Sensor数据量比较大,IBind实现比较困难。真正实现Sensor数据传送的是管道,在创建SensorEventConnection实例中,创建了BitTube对象,里面创建了管道,用于客户端与服务端的通信。

客户端

时序图

客户端主要在SensorManager.cpp中创建消息队列

class ISensorEventConnection; class Sensor; class Looper; //

----------------------------------------------------------------------------

class SensorEventQueue : public ASensorEventQueue, public RefBase {

public:

SensorEventQueue(const sp& connection);

virtual ~SensorEventQueue(); virtual void onFirstRef(); //获取管道句柄 int getFd() const; //向管道写数据

static ssize_t write(const sp& tube,

ASensorEvent const* events, size_t numEvents); //向管道读数据

ssize_t read(ASensorEvent* events, size_t numEvents);

status_t waitForEvent() const; status_t wake() const; //使能Sensor传感器

status_t enableSensor(Sensor const* sensor) const; status_t disableSensor(Sensor const* sensor) const;

status_t setEventRate(Sensor const* sensor, nsecs_t ns) const;

// these are here only to support SensorManager.java status_t enableSensor(int32_t handle, int32_t us) const; status_t disableSensor(int32_t handle) const;

private:

sp getLooper() const;

//连接接口,在SensorService中创建的

sp mSensorEventConnection; //管道指针

sp mSensorChannel; mutable Mutex mLock;

mutable sp mLooper; };

View Code

SensorEventQueue类作为消息队列,作用非常重要,在创建其实例的时候,传入了SensorEventConnection的实例,SensorEventConnection继承于ISensorEventConnection。

SensorEventConnection其实是客户端调用SensorService的createSensorEventConnection()方法创建的,它是客户端与服务端沟通的桥梁,通过这个桥梁,可以完成一下任务:

1. 获取管道的句柄 2. 往管道读写数据

3. 通知服务端对Sensor使能

流程解析 客户端获取SensorService服务实例 客户端初始化的时候,即SystemSensorManager的构造函数中,通过JNI调用,创建native层SensorManager的实例,然后调用SensorManager::assertStateLocked()方法做一些初始化的动作。 status_t SensorManager::assertStateLocked() const { if (mSensorServer == NULL) { // try for one second const String16 name(\ …… status_t err = getService(name, &mSensorServer); …… mSensors = mSensorServer->getSensorList(); size_t count = mSensors.size(); mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*)); for (size_t i=0 ; i

Sensor框架Framework层解读 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:注册分类1、2、3、5.1类申报资料要求(试行)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: