添加到了系统服务管理中,客户端可以通过defaultServiceManager:getService()获取到Sensor服务的实例。
继承BnSensorServer这个是sensor服务抽象接口类提供给客户端调用:
class Sensor;
class ISensorEventConnection;
class ISensorServer : public IInterface {
public:
DECLARE_META_INTERFACE(SensorServer); //获取Sensor列表
virtual Vector
//创建一个连接的接口,这些都是提供给客户端的抽象接口,服务端实例化时候必须实现
virtual sp
};
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
virtual ~SensorEventQueue(); virtual void onFirstRef(); //获取管道句柄 int getFd() const; //向管道写数据
static ssize_t write(const sp
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
//连接接口,在SensorService中创建的
sp
sp
mutable sp
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