Android(安卓)IPC 进程间通信机制之 Messenger
16lz
2021-01-26
Messenger 作为一个跨进程通信工具,它可以让你通过互相传递 Message 来进行跨进程数据交互共享。对于Android来说,Messenger是一个轻
量级的 IPC 方案,内部对 AIDL 进行了封装。它的实现较之 AIDL 方式也更为容易。
1、创建我们的服务端 WorkService :
import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.util.Log;public class WorkService extends Service { public static final int MSG_FROM_CLIENT = 101; private Handler workHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSG_FROM_CLIENT: Bundle bundle = msg.getData(); //打印接收到的客户端信息 Log.d("RJie", "WorkService: " + bundle.getString("msg")); //通过 msg 的 msg.replyTo 得到客户端传来的 Messenger 对象 Messenger workMessenger = msg.replyTo; Message serviceMsg = Message.obtain(null, WorkService.MSG_FROM_CLIENT); Bundle serviceBundle = new Bundle(); serviceBundle.putString("rep", "收到,客户端你好,这里是服务端!!!"); serviceMsg.setData(serviceBundle); try { //发送消息给客户端 workMessenger.send(serviceMsg); } catch (RemoteException e) { e.printStackTrace(); } break; } } }; @Override public IBinder onBind(Intent intent) { //通过接收消息的 Handler 来获取 Binder 对象 return new Messenger(workHandler).getBinder(); }}
2、在清单文件中注册服务:android:process 必须给值 让服务端与客户端运行在不同的进程 “:” 表示项目包名 后面的值任意
3、客户端代码:
import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.Process;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class MainActivity extends AppCompatActivity { //声明一个 Handler 对象来接收服务端发送来的消息 private Handler mainHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case WorkService.MSG_FROM_CLIENT: Log.d("RJie", "MainActivity: " + msg.getData().getString("rep")); break; } } }; private Messenger mainMessenger; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //打印出 UI 线程所在进程的id Log.d("RJie", "MainActivity.pid==" + Process.myPid()); //绑定服务端 Intent workServiceIntent = new Intent(MainActivity.this, WorkService.class); bindService(workServiceIntent, sc, Context.BIND_AUTO_CREATE); } //声明一个 ServiceConnection 来对客户端与服务端的连接后业务进行处理 private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //通过 IBinder 对象创建一个 Messenger 对象 mainMessenger = new Messenger(service); Message mainMessage = Message.obtain(mainHandler, WorkService.MSG_FROM_CLIENT); Bundle mainBundle = new Bundle(); mainBundle.putString("msg", "这里是客户端,听到请回答!!!"); mainMessage.setData(mainBundle); //将 Messenger 对象传递给服务端 mainMessage.replyTo = new Messenger(mainHandler); try { //发送消息给服务端 mainMessenger.send(mainMessage); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onDestroy() { super.onDestroy(); //解绑服务端 unbindService(sc); }}
运行结果:
06-16 20:18:54.907 3668-3668/? D/RJie: MainActivity.pid==366806-16 20:18:54.987 3688-3688/? D/RJie: WorkService.pid==368806-16 20:18:55.057 3688-3688/? D/RJie: WorkService: 这里是客户端,听到请回答!!!06-16 20:18:55.110 3668-3668/? D/RJie: MainActivity: 收到,客户端你好,这里是服务端!!!
到这,简单的 Messenger 使用就完成了。
、更多相关文章
- Android中的网络编程系列(一):URLConnection
- Android的Http网络请求模型初步
- Android(安卓)Audio底层原理(二)
- Unity 与 Android(安卓)aar 包通讯
- Android客户端每周自动化回归报告
- 开源中国-android客户端源代码阅读1
- Data Binding(数据绑定)用户指南
- Android(安卓)TextView中文字设置超链接、颜色、字体
- python服务器与android客户端socket通信实例