Android进程间通信(IPC)AIDL详解

1:在android系统中,一个应用就相当于一个进程,当然一个应用可以有多个进程,一个应用设置多个进程的有点就是获取更多的内存,因为android会为每个虚拟机设置一个最大的内存使用量,使用多进程就可以突破這个内存限制。

2:多进程实现方式,可以在activity或者service中设置process属性,这个属性设置有两种方式(:name,或者完整的命名方式,以:name命名的会默认在前加上当前包名,其为当前应用的私有进程,其他应用组件不能运行在在这个进程内,以完整命名方式命名的进程为全局进程,其他应用可以通过shareUid的方式运行在这个进程内)

3:多进程造成的问题:

1:静态成员和单列模式完全失效

2:通过SharedPreference可靠性降低

3:Application会多次创建

4:线程同步机制会完全失效

4:這里顺便提一下serialVersionUID ;这个参数在反序列化时会先比对文件中的serialVersionUID和当前类的serialVersionUID是否相同,如果不相同证明可能当前类版本不一样或者是其他原因,反序列化失败,如果相同则序列化成功

5:多进程通信实现方式:

Bundle/ Messenger/ AIDL/ Socket/ 文件共享/ 等方式


6:AIDL进程中通信

服务端:需要创建一个service来监听客户端的连接请求,然后再OnBinder中创建一个Binder对象返回,這个Binder对象就是我们自己申明的aidl文件中的Stub内部类(這个后面会讲到,Stub继承自Binder,实现了自定义aidl接口),并在Stub内种实现aidl接口的方法


客户端:通过绑定服务端的service,返回一个Binder对象(其实就是stub内部类对象),然后通过把這个binder对象转换成一个我们接口定义的对象就可以调用服务端接口中的方法了,


具体实现:

1:创建aidl文件,一般我们都创建区别于自身应用的独立的包名,這样有利于把包直接复制到服务端,如果AIDL中有自定义class的话一定要在aidl中申明自定义的class,不然会包报can't find class 异常,申明后我们可以在gen/目录下看到系统自动为我们生成的BookManager.java文件(AIDL的具体实现)

     2:在aidl中申明class 就是创建一个name.class的文件即可,在文件中申明

package AIDL;//包名
parcelable Book;//类名

3:aidl文件创建完成后复制一份到服务端应用(如果是在同一个应用内的话就不用复制了),然后在服务端创建一个Service等待客户端的连接监听



4:客户端的具体实现就很简单了,

这就通过aidl实现了进程间通信了,

5:当调用BookManager.stub.adInterface()时,asInterface方法内会通过一个Binder.queryLocalInterce(Binder)进行查找,如果找到不需要进程间通信就直接返回,如果找不到则会通过return BookManager.Stub.Proxy(binder)返回RemoteBinder,实现进程间通信,

6:当跨进程调用方法时,会先调用onTransact()来判断是调用的那个方法然后调用,每个方法在其内部都有一个唯一的标识,如图

就写到此处吧。第一次认认真真写博客,可能博客中有一些不足或者是错误的地方,还请麻烦各位看客指出来,



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值