Android 跨进程通信--Messenger
2016-07-11 13:38
423 查看
通过Messenger可以在不同的进程中传递Message,Messenger是一个轻量级的IPC方案,他的底层实现是AIDL。
下面是服务端与客户端实现的代码,主要实现了两个进程简单的相互通信:
服务端:
public class MessengerService extends Service {
private static final String Tag = "MessengerService";
private static final int MSG_FROM_CLIENT = 1;
private static final int MSG_FROM_SERVICE = 2;
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
// 客户端发来的信息
Log.i(Tag, "msg from client : " + msg.getData().getString("msg"));
// 回复客户端
Messenger client = msg.replyTo;
Message replyMessage = Message.obtain(null, MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply", "消息收到,稍后回复");
replyMessage.setData(bundle);
try {
client.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
private final Messenger mMessenger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
客户端:
public class MainActivity extends Activity {
private static final String Tag = "MainActivity";
private static final int MSG_FROM_CLIENT = 1;
private static final int MSG_FROM_SERVICE = 2;
private Messenger mService;
private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_SERVICE:
Log.i(Tag,"msg from service : " + msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName className) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mService = new Messenger(service);
Message msg = Message.obtain(null, MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "hello messenger~");
msg.setData(data);
// 客户端发送信息时,需要把接收服务端会的Messenger通过Message的replyTo参数传递给服务端
msg.replyTo = mGetReplyMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
注意service要在AndroidManifest.xml中注册:
<service
android:name="com.example.messagertestapplication.MessengerService"
android:process=":remote" >
</service>
结果:
Messenger工作原理图:
下面是服务端与客户端实现的代码,主要实现了两个进程简单的相互通信:
服务端:
public class MessengerService extends Service {
private static final String Tag = "MessengerService";
private static final int MSG_FROM_CLIENT = 1;
private static final int MSG_FROM_SERVICE = 2;
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
// 客户端发来的信息
Log.i(Tag, "msg from client : " + msg.getData().getString("msg"));
// 回复客户端
Messenger client = msg.replyTo;
Message replyMessage = Message.obtain(null, MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply", "消息收到,稍后回复");
replyMessage.setData(bundle);
try {
client.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
private final Messenger mMessenger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
客户端:
public class MainActivity extends Activity {
private static final String Tag = "MainActivity";
private static final int MSG_FROM_CLIENT = 1;
private static final int MSG_FROM_SERVICE = 2;
private Messenger mService;
private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_SERVICE:
Log.i(Tag,"msg from service : " + msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName className) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mService = new Messenger(service);
Message msg = Message.obtain(null, MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "hello messenger~");
msg.setData(data);
// 客户端发送信息时,需要把接收服务端会的Messenger通过Message的replyTo参数传递给服务端
msg.replyTo = mGetReplyMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
注意service要在AndroidManifest.xml中注册:
<service
android:name="com.example.messagertestapplication.MessengerService"
android:process=":remote" >
</service>
结果:
Messenger工作原理图:
相关文章推荐
- Nubo:虚拟化Android的MDM解决方案
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
- 多个 Android Drawable shape 组合画田字格
- Android Dialog汇总
- 【Android基础知识】ViewStub的使用
- (原创)android PowerManager分析(十分详细)
- Android控件ToggleButton的使用与修改
- 瀑布流StaggeredGridView
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
- Android studio 中设置作者和创建日期等注释模板
- Android framework系统默认设置修改
- android zxing编译核心代码
- Android : Drawable之getIntrinsicWidth()和getIntrinsicHeight()
- android使用mpandroidchart绘制图表
- Android开发--NDK之环境搭建
- Serializable和Parcelable的解析与使用
- Android 6.0 adb remount后没有写权限,提示Read-only file system
- Android-DayNight-Mode 夜间模式的坑
- Android 开发笔记 - git 篇 动态生成版本信息
- Android如何让EditText的输入框变为方框