Camera框架初探

先解释一些概念,然后带着思考去解读

1.CameraService。

2.Camera

3.BnCameraClient

4.BnCamera

5.Client

不得不说的是android对于binder的使用,真是出神入化。废话不说,明白了以上对象后,对于camera框架的理解就会上一个档次。网上很多人,都是抄来抄去,真正去看代码的时候,发现纸上得来终觉浅,觉知此事要躬行。

下面依次解释:

1.CameraService

Camera的服务端,是一个BnCameraService,同时还是一个BinderService。代码就不贴了,自行看吧。看到Bn两个字母,大家的第一印象肯定是onTransact接口。而事实也是如此:

class BnCameraService: public BnInterface<ICameraService>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

2.Camera

继承于BnCameraClient.大家又看到一个Bn。很是纳闷,那么是不是也是个服务端呢。答案也是肯定的。

class Camera : public BnCameraClient, public IBinder::DeathRecipient
class BnCameraClient: public BnInterface<ICameraClient>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

既然都是服务端,那么客户端在哪里呢。下面继续。

3. BnCameraClient

这个不说了,上面已经讲了,是个服务端

4.BnCamera

同样是服务端:

class BnCamera: public BnInterface<ICamera>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

5.Client

同样是服务端:

    class Client : public BnCamera

那么客户端在哪里?为什么全是服务端?

其实这些都是服务端,同时又是客户端。Binder是一个单向通信的东西,要想实现双向通信,那么自己也必须是一个服务端。这就是为什么全是服务端了。网上介绍说CameraService是一个sevice,Camera这个就是一个client,这是不对的。

这两个都是service,又是client。这样才能支持双向通信。

使用流程如下:首先要new一个Camera对象,这个对象实际上是个Manager,负责对camera进行一些管理。

然后通过connect方法,获得到一个ICamera的对象,这个对象在服务端就是Client。于此同时,由于自己是一个BnCameraClient,注意是Bn,可以通过binder传过去,那么传过去之后是什么呢。是ICameraClient.这样服务端和客户端都得到了一个对方的句柄,从而建立了双向通信的渠道。下面这个图说明了这个思想:


猜你喜欢

转载自daojin.iteye.com/blog/1756109
今日推荐