Android中的IPC方式

来源:互联网 发布:合肥软件开发 编辑:程序博客网 时间:2024/05/16 11:13

首先仍然是关于Binder的

Binder中有俩很重要的方法linkToDeath和unlinkToDeath.通过linkToDeath我们可以额给Binder设置一个死亡代理,当Binder挂掉时,我们就会接到通知,此时我们可以重新发起链接请求从而恢复链接。
首先:声明一个DeathRecipient对像

mDeathRecipient = new DeathRecipient() {            @Override            public void binderDied() {                if (mBookManager ==null)                     return;                mBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);                mBookManager=null;                //重新绑定远程Service            }        };

绑定成功后给binder设置死亡代理

mService = IMessageBoxManager.Stub.asInterface(binder);binder.linkToDeath(mDeathRecipient,0);

齐活~


大概清楚了序列化和Binder后 开始了解跨进程通信。

1. 使用Bundle:
由于Bundle实现了Parcelable接口,所以他可以方便的在不同的进程间传输,当我们在一个进程中启动了另一个进程的Activity、Service和Receiver,我们就可以在Bundle中附加各种信息然后通过Intent发送。
有一种特殊场景:
A进程在进行一个计算,计算完后启动B进程的一个组件并把计算结果 传递给B,如果这个计算结果不支持放入Bundle中,因此无法通过Intent来传输,此时可以考虑如下方式:通过Intent启动B的一个Service组件,让Service在后台进行运算,计算完毕启动B中的目标组件。齐活~
2. 使用文件共享
两个进程通过读/写同一个文件来交换数据。这种方式对于文件格式没有具体的要求,可以是文本文件,也可以是XML文件,只要读/写双方约定数据格式即可。这种方式也是有局限性的,比如说并发读/写问题。如果并发读/写,那么有可能读出的内容不是最新的,如果并发写问题会很严重,所以要尽量避免并发写这种情况或者考虑使用线程同步来限制多个线程的写操作。(不建议在进程间通信中使用SharedPreferences)
3.使用Messenger
我们可以通过Messenger在不同进程中传递Message对像,在Message中放入我们需要传递的数据。Messenger是一种轻量级的IPC方案,他的底层实现是AIDL。实现一个Messenger有如下几个步骤,分别为服务端和客户端:
服务端
创建一个Service处理客户端的连接请求,创建一个Handler并通过Handler创建一个Messenger对像,然后再Service的onBind中返回这个Messenger对像底层的Binder即可。
客户端
首先绑定服务端的Service,用服务器返回的IBinder对像创建一个Messenger,通过Messenger就可以向服务器发送消息了,发送消息类型为Message对像。

0 0
原创粉丝点击