IPC机制(跨进程通信)

来源:互联网 发布:mac暗影格斗2修改 编辑:程序博客网 时间:2024/06/13 16:27

一、线程和进程的区别

线程是cpu执行的最小单元,进程是一个执行单元一般指一个程序和应用。因此进程和线程是包含与被包含的关系

二、使用IPC时机

1、由于某种特殊原因 如:插件化开发
2、因为应用所需内存太大 需要多进程来获取更多空间

三、开启bIPC的方式

通过在四大组件中设置android:process 属性。
1)直接包名加上”:remote”这种方式是属于当前应用的的私有进程其他应用不能调用
2)通过直接加上新的包名,其他应用可以通过”ShareUID”方式+相同的签名来让其跑在同一进程中。

四、多进程对一些常用功能造成失效

1)静态成员的单例模式失效
2)线程同步失效
3)SharedPredfrences的可靠性下降
4)Application多次创建

五、Serializable接口的使用

Serializable支持序列化和反序列化。通过制定serialVersionUID来为反序列化提供支持

六、Parcelable接口

1、writeToParcle(Parcel,int)主要用于序列化
2、CREATOR主要用于反序列化

七、使用Parcelable和serializable的时机

Parcelable主要用于内存序列化
Serializable主要用于存储设备和网络序列化

八、Binder的作用

1、从IPC角度他是Android跨进程通信的一种方式
2、从FrameWork角度来说是ServiceManager连接各种Manager和ManagerService的桥梁
3、从应用角度来说是Binder客户端和服务端通信的桥梁

九、IPC的开发流程。以《android开发艺术探索》P48为例

1、首先建立实现了Parceable接口的java类
2、建立Book的AIDL文件
3、记录实现了IBookManager.aidl接口的方法
4、生成IBookManage.aidl的Binder类
继承于IInterface接口里面包含:1、IBookManager中的方法声明2、IBookManager中俩个方法的常量值3、一个实现了IBookManager接口继承了Binder类的Stub抽象类形如:public static abstract class Stub extends Binder implements IBookManager 具体实现如下:
1)asInterface(IBinder)用于将服务端的Binder对象转换成客户端所需的AIDL对象。如果在在同一进程则直接使用服务端对象本身。若位于不同进程则使用Stub.proxy对象
2)asBinder返回Binder对象
3)onTransact方法运行于服务端的Binder线程池中。用户执行客户端请求的服务端方法结果。public boolean onTransact(int code,Parcel data,Parcel reply,int flag).
code用于确认请求所需的方法。data应用于取出目标方法所需参数。reply用于返回结果
4)Proxy#getBookList位于客户端来调用服务端相应的方法
九、linkToDeath和unlinkToDeath
当服务端进程被终止时需要通知客户端做出相应的处理这时就需要使用linkToDeath来监听服务端。
1)声明DeathRecipient对象。DeathRecipient是一个接口包含了binderDied的声明
2)在客户端绑定服务端成功后就可以调用binder.linkToDeath(deathRecipient,flag)来监听
3)当服务端断开时会调用binderDied方法同时调用binder.unlinktoDeath取消监听

十、IPC方式的比较

1、使用Bundle 当我们在一个进程中启动另外一个进程的Activity、Service、Receiver时可以通过Bundle进行传递。Bundle支持的类型:基本类型、实现了Parcelable级Serializable的类型
2、使用Messenger :他是以串行的方式 处理请求,所以无需处理同步问题,当不能同时处理大并发
服务端
1)在服务端定义一个继承于Handler的MessengerHandler类.
2)新建一个以MessengerHandler对象的参数的Messenger对象
Messenger messenger=new Messenger(new MessengerHandler())
3)在onBind中返回Binder对象即messenger.getBinder()对象
客户端
1)在onServiceConntected方法中创建Messenger对象
mService=new Messenger(binder)
2)创建消息 Message msg=Message.obtain()
3)发送消息
mService.send(msg);
3、使用AIDL方式
1)建立AIDL文件、实现了Parcelabe接口的类及其声明
2)远程服务端Service的实现:创建一个继承于Stub的类并实现其AIDL方法并在onBind中返回实例 需要注意多线程的同步问题 可以采用CopyOnWriteArrayList方式
3)客户端Service的实现:通过bindservice连接服务端在回调函数中实现onserviceConnected中利用IBookManager.Stub.asInterface()实现调用IBookManager的实例

十一、AIDL中实现观察者模式。

当服务端需要传递消息到客户端时就需要实现观察者模式
1)声明Listener接口
2)在AIDL声明相关的监听和取消监听方法
3)在服务端声明RemoteCallbackList来保存Listenter接口
4)当需要发起通知时调用 beginBroadcast()来轮询监听器发起通知并调用finishhBroadcast结束监听

十二、AIDL线程池

指通过增加BindPoolService来统一的调度相应的Binder,从而到达减少service数量的作用
客户端首先调用BindPollService来获取获取BinderPool的实例再通过BinderPool的实例获取相应的Binder

0 0
原创粉丝点击