先解释一些概念,然后带着思考去解读
1.CameraService。
2.Camera
3.BnCameraClient
4.BnCamera
5.Client
不得不说的是android对于binder的使用,真是出神入化。废话不说,明白了以上对象后,对于camera框架的理解就会上一个档次。网上很多人,都是抄来抄去,真正去看代码的时候,发现纸上得来终觉浅,觉知此事要躬行。
下面依次解释:
1.CameraService
Camera的服务端,是一个BnCameraService,同时还是一个BinderService。代码就不贴了,自行看吧。看到Bn两个字母,大家的第一印象肯定是onTransact接口。而事实也是如此:
class BnCameraService: public BnInterface{ 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{ 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{ 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.这样服务端和客户端都得到了一个对方的句柄,从而建立了双向通信的渠道。下面这个图说明了这个思想: