}
}
可以看到有这么四个自定义的方法,说明如下:
-
writeToParcel 实现序列化功能,写入到parcel
-
describeContents 提供内容描述,几乎都是返回0,只有在存在文件描述符的时候才返回1
-
createFromParcel 实现反序列功能,从序列化后的对象中创建原始对象
-
newArray 提供数组容器
Parcelale
和Serializable
都能实现序列化,怎么选呢?我们可以根据两种方案的区别来选择。Serializable
使用简单,但是开销比较大,在序列化和反序列化的过程中需要大量的I/O操作。而Parcelable
的使用稍微复杂一些,但是性能比较好是Android 推荐的序列化方式。所以在进行内存传递的时候,可以使用Parcelable
进行序列化,但是在涉及到持久化和网络传输的时候,Parcelable
也能实现,但是使用会比较复杂,所以在这两种情况下建议使用Serializable
。上面就是两种序列化方案的区别。
====================================================================
Binder是Android专有的一种通信方式,Binder底层有kernel驱动的支持,设备驱动文件是/dev/binder,通过该驱动,android 在native层有一整套C/S架构,在java层也封装了一层相应实现。直观来说,Binder是Android中的一个类,它继承了IBinder接口。 Binder 可以进行跨进程通讯,也可以进行本地进程通讯。我们在写一个无须跨进程的本地服务 LocalService 时,可以直接获取Binder类来进行通讯。 基于binder,Android实现了多个ManagerService。因为android 系统有各种系统组件硬件需要暴露给其他进程,并且要集中管理,所以安卓在实现管理方案之后,再通过binder来暴露对应的接口服务,比如pms,ams,wms。 Android开发中,开发者对于Binder最直接的应用就是使用AIDL,相关使用流程大概有以下几步:
-
创建aidl文件,声明方法
-
继承生成的Stub类(Binder的抽象子类),实现服务端操作的相关接口方法
-
创建另一个进程中运行的service,在其onBind方法中返回该Binder实例
-
使用该Service,通过
ServiceConnection#onServiceConnected
回调中得到的参数IBinder 获取定义接口的Binder实例。如IHelloManager.Stub.asInterface(service)
。 -
通过Binder实例进行远程方法调用。
先看谷歌官方开发者文档的介绍 我们可以利用AIDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在安卓中,编写进程间通信的代码较为繁琐,Android 会使用AIDL 帮我们处理这类问题。 我们先从一个典型的AIDL实例入手来探究。
定义AIDL接口
我们来定义一个 aidl 接口文件
//IHelloManager.aidl
package top.guuguo.wanandroid.tv;
import top.guuguo.wanandroid.tv.User;
interface IHelloManager {