美文网首页
使用Messenger进行跨进程(IPC)编程

使用Messenger进行跨进程(IPC)编程

作者: xlq | 来源:发表于2018-07-31 16:33 被阅读0次

    Messenger作为跨进程编程的方式之一,相对于AIDL,是比较简单的,接下来我来一步步记录,如何编写一个Messenger实例。

    1. 既然是跨进程,肯定是需要client 和 server 。而且两边都需要一个Messenger的对象,使用Handler来作为Messenger的参数来处理信息。Server端的messenger是用于处理Client端的请求信息,Client端的messenger用于处理Server端的回复信息,具体新建messenger的模版代码如下,里面的处理逻辑就不详述:
    private Messenger mMessenger = new Messenger(new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        });
    
    1. Client端需要拿到Server端的Messenger,调用 messenger.send()给Server端发送信息,如何做呢? 刚好我们当我们bind Service的时候,会返回一个IBinder 给Client端, 所以,Client端代码如下:
    private Messenger mServerMessenger;
    private ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                mServerMessenger = new Messenger(iBinder);
            }
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
            }
        };
    

    那么Server端的返回IBinder的方法就是如下:

    @Override
        public IBinder onBind(Intent intent) {
            return mServerMessenger.getBinder();
        }
    
    1. Client端发送信息,此时会涉及到几个类的使用,Message、Handler、Bundle等。且在发送消息的同时,需要指定 Server端返回的数据,找Client端的某个messenger来处理。具体代码如下:
    Message message = Message.obtain();
                Bundle bundle = new Bundle();
                bundle.putString("server",“发送的消息");
                message.setData(bundle);
                message.replyTo = messenger; ///指定返回的数据找messenger来处理
                try {
                    mServerMessenger.send(message); ///使用Server端的messenger发送
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
    
    1. Server端回复信息,当得到Client端请求信息后,不需要拿到客户端的messenger来返回消息,而是直接使用获得的客户端的message,调用方法 message.replyTo.send()方法来回复信息。具体代码:
    Message message = Message.obtain();
                Bundle bundle = new Bundle();
                bundle.putString("server",replyString);
                message.setData(bundle);
                try {
                    msg.replyTo.send(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
    
    1. 此时消息已经回复过去了,第三步中我们指定的messenger会来处理回复的数据。

    到此使用Messenger来跨进程通讯就完成了。

    相关文章

      网友评论

          本文标题:使用Messenger进行跨进程(IPC)编程

          本文链接:https://www.haomeiwen.com/subject/aeehvftx.html