美文网首页
Android IPC机制:Messenger

Android IPC机制:Messenger

作者: yyg | 来源:发表于2018-03-15 17:03 被阅读32次

Messenger可以被翻译为信使,通过它可以在不同进程中传递Message对象。在message中放入需要传递的数据,就可以实现数据在进程中传递。Messenger是一种轻量级的IPC方案,底层实现还是AILD,具体见构造方法。

public Messenger(Handler target) {
        mTarget = target.getIMessenger();
}

public Messenger(IBinder target) {
        mTarget = IMessenger.Stub.asInterface(target);
}

一、对于Messenger的使用先从原理图开始

图.png
二、实现Messenger的具体步骤
  1. 服务端进程
    服务端需要创新一个Server来处理客户端的连接请求,同事创建一个Handler并通过它创建一个Messenger对象,然后在Server的onBind中返回Messenger底层的Binder即可。

  2. 客户端进程
    首先需要绑定服务,连接成功之后使用服务端返回的IBinder对象创建一个Messenger对象,通过这个Messenger对象可以传递Message对象。
    如果需要服务端回应客户端,则需要向服务端一样,创建一个Handler和一个由它构造出来的Messenger,并将这个Messenger对象通过Message.replyTo=Messenger传递给服务端。之后服务端就可以获取Message利用同样的方法实例化一个Messenger,之后就可以给服务端传递信息,并由Handler处理。

  3. 代码
    服务端

public class MessengerService extends Service {
    public static final String TAG = MessengerService.class.getSimpleName();

    private final Messenger mMessenger = new Messenger(new MessengerHandler());

    public MessengerService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        //获取messenger的binder对象返回给客户端使用
        return mMessenger.getBinder();
    }

    public static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MyConstants.MSG_FROM_CLIENT:
                    Log.e(TAG, "来自客户端的消息" + msg.getData().getString("msg"));
                    //给客户端做出回应
                    Message message = Message.obtain(null, MyConstants.MSG_FROM_SERVER);
                    Bundle data = new Bundle();
                    data.putString("msg", "亲!你已经成功连上服务器了!");
                    message.setData(data);
                    try {
                        msg.replyTo.send(message);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

}

客户端

public class MainActivity extends AppCompatActivity {
    public static final String TAG = MainActivity.class.getSimpleName();
    private Messenger mServer, mClient;
    private Intent mIntent;
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //连接成功,使用服务端传递过来的Ibinder对象实例化messenger
            mServer = new Messenger(service);
            Message message = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);
            Bundle data = new Bundle();
            data.putString("msg", "来自客户端的消息");
            message.setData(data);
            //将客户端的messenger传递给服务端,以便服务端响应客户端
            message.replyTo = mClient;
            try {
                mServer.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIntent = new Intent(this, MessengerService.class);
        mClient = new Messenger(new MyHandler());

    }

    public void bindServer(View view) {
        //绑定服务
        bindService(mIntent, mServiceConnection, BIND_AUTO_CREATE);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mServiceConnection);
    }

    private class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                //来自服务器的回应
                case MyConstants.MSG_FROM_SERVER:
                    Log.e(TAG, "来自服务器的消息" + msg.getData().get("msg"));
                    break;
                default:
                    super.handleMessage(msg);

            }
        }
    }
}

相关文章

网友评论

      本文标题:Android IPC机制:Messenger

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