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.这样服务端和客户端都得到了一个对方的句柄,从而建立了双向通信的渠道。下面这个图说明了这个思想:

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值