IPC基础概念
IPC的基础概念包括Serializable接口,Parcelable接口,Binder。
<关于Serializable接口>
序列化的空接口。
serialVersionUID可以定义也可以不用定义。其工作机制是在序列化的时候将serialVersionUID写入文件中,然后反序列化的时候对比文件中的ID和原ID,如果相同则可以反序列化,否则就会报错,文件在中间出现了数据的变化。 所以我们手动去定义一个UID可以很大程度保证反序列化的时候不会出错。静态成员变量因为属于类不属于对象,还有transient关键字标识的成员这些都不会参与序列化过程。
<关于Parcelable接口>
反序列方法由CREATOR来完成,其内部标明了如果创建序列化对象和数组。
假如在序列化的A类中有另外一个需要操作的别的序列化类B,则B需要反序列化需要传递当前线程的上下文类加载器,否则将无法找到类。
List和Map都可以序列化,前提是他们里面的每个元素都是可序列化的。
比较Parcelable和Serializable:
Serializable是JAVA序列化的接口,开销很大,序列化和反序列化都需要大量的I/O操作。
而Pacelable是Andorid序列化的接口,虽然写起来有点麻烦,但是效率很高,更适用于Android平台。Serializable更适合将对象序列化到存储设备中或者序列化后通过网络传输。
<关于Binder>
Binder是一个实现了IBinder接口。
Messenger的底层是AIDL。用Aidl来做例子。我们在写出MyAIDLManager.aidl后系统为我们生成了MyAIDLManager.java这个类。它继承自IInterface接口,同时自己也是一个接口,它里面声明了MyAIDLManager中我们写的方法,然后给每个方法声明了整型id去标识,就是客户端在申请的时候在transact用哪个id,就是哪个方法。接着声明Stub内部类,它是个Binder类,当客户端和服务端位于一个进程的时候不会去走transact,否则就要走transact这个过程。这个逻辑由Stub的内部类Proxy来实现。
- DESCRIPTOR:
binder的唯一标识,一般用当前的Binder类名来表示。
- asInterface(android.os.IBinder obj)
用于将服务端的Binder对象转换成客户端所需的AIDL接口类型对象,这种转换过程是区分进程的,如果客户端和服务端位于同一个进程,那么此方法返回的就是服务端的Stub对象本身,否则返回的是系统封装后的Stub.Proxy对象。
- asBinder
返回当前的Binder对象
- onTransact
运行在Binder线程池中。用来处理客户端的请求。服务端同过code来确定方法,从data中取出参数,再用目标方法去执行。执行完以后向rely中写入返回值、
- Proxy方法1
这个方法运行在客户端,它调用时,内部:首先创建该方法所需的输入型Parcel对象_data,输出型Parcel对象_reply和返回值对象List,然后把该方法的参数写入_data中,接着调用transact方法发起RPC(远程过程调用),同时当前线程挂起,服务端的onTransact被调用,知道RPC返回后,当前线程继续执行,并从_reply中取出RPC的返回结果,最后返回_reply中的数据。
下图为客户端到服务端的机制。
当binder因为异常而死亡的时候,为了解决客户端受到的影响,可以通过linkToDeath设置死亡代理。首先声明一个DeatheathRecipient对象,这是一个接口,其内部只有binderDied,当Binder死亡的时候,系统回调这个方法,然后我们就可以移处之前的binder代理并重新绑定远程服务,然后在绑定之后给binder设置死亡代理。具体代码为:
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathReceipient(){
publi void binderDied(){
尾声
开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。
- 330页 PDF Android核心笔记
- 几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题
- PDF和思维脑图,包含知识脉络 + 诸多细节
- Android进阶系统学习视频
img-BXb6xPum-1719654051099)]
- Android进阶系统学习视频
[外链图片转存中…(img-zlzZ9UmD-1719654051099)]