Android IPC机制利用机制利用Messenger实现跨进程通信实现跨进程通信
写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过
程中的一些理解。这一章使用Messenger实现跨进程通信,其中bindService基础部分参见Android IPC机制绑定Service实现本
地通信。
跨进程简介跨进程简介
在介绍使用Messenger跨进程通信之前先要了解以下问题:为什么需要跨进程通信?只有有了需求才有学习的价值。我个人将
不同进程简单的理解为不同的应用程序(当然也有例外,比如可以在同一个应用程序中开启两个或多个进程)。由于进程之间
不能像线程一样共享内存,所以数据通信不能像线程一般进行。在Android中可以使用bundle,广播,Messenger,AIDL和
Socket进行跨进程通信。本章利用Messenger分别进行单应用程序多进程单向通信和多应用程序多进程双向通信的实现。
Messenger介绍介绍
Messenger是通过使用是通过使用Message来实现跨进程通信,一次实现一个请求的方式,这是它的优点也是缺点来实现跨进程通信,一次实现一个请求的方式,这是它的优点也是缺点。其底层实现为
AIDL(下章我将阐述)。Messenger的优点是:基于Message,方便使用;支持回调的方式,也就是服务端处理完成长任务
可以和客户端交互;不需要编写aidl文件。
Messenger使用流程如下(转载):
单应用程序多进程单向通信
先介绍一下Android中单应用程序开启多进程的方法,实际上只要在mainfests中的你想开启新进程的组件的XML中添加
<android:progress = “:remote(可以自定义)”>或者<android:progress = “包.remote(可以自定义)”>就行。如:
<service android:name=".CustomService" android:process=":remote"/>
这样就把Service放在新的线程中运行了。
Service实现实现
下面是服务端的代码实现,具体思路是:创建一个Handler对象用来处理客户端发送来的消息,再创建一个Messenger对象将
上面的Handler对象作为参数传入,这样我们就获得了一个信使。下面就是通过getBinder()把这个信使创建的Binder对象返回
给客户端(一旦客户端拿到这个Binder,又可以将它还原为Messenger)。Handler中处理信息为:当得到的Message的what
值为MSG_SAY_HELLO时输出Toast。
public class CustomService extends Service{
static final int MSG_SAY_HELLO = 1;
//实现一个能够处理接收信息的Handler
class IncomingHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case MSG_SAY_HELLO:
Toast.makeText(getApplicationContext(),"hello!",Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
}
//被客户端接收的Messenger对象
final Messenger messenger = new Messenger(new IncomingHandler());
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(getApplicationContext(),"binding!",Toast.LENGTH_SHORT).show();
return messenger.getBinder();
}
评论0
最新资源