美文网首页
Android进程间通信--Messenger

Android进程间通信--Messenger

作者: 王世军Steven | 来源:发表于2016-09-29 14:43 被阅读125次

    4.3 使用 Messenger 实现进程间通信

    Messenger 是一种轻量级的IPC通信机制.底层使用的是AIDL机制.
    Messenger 一次只处理一个请求因此不存在线程同步的问题.
    Messenger传递的数据类型是 : Message 对象.

    构造方法:

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

    实现Messenger的步骤 :

    1, 服务端进程

    1, 创建一个Service来处理客户端的请求.
    2, 创建一个handler 用它来创建messenger对象.
    3, 在Service的onBinder方法中返回这个Messenger底层的Binder对象即可.
    

    2, 客户端进程

    1, 绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger对象.
       通过这个Messenger就可以向服务端发送消息了.发送消息的类型为message 对象.
       
    2, 如果需要服务端回复客户端就需要创建一个Handler,利用这个Handler 创建一个Messenger对象.
       Messenger对象通过message 的 replyTo 参数传递给服务端.
    

    3, 示例代码

    服务端关键代码

    /**
     * 服务端进程.
     * Created by WSJ on 2016/9/29.
     */
    public class MessengerService extends Service {
        private static final String TAG = "MessengerService";
        private static class MessengerHandler extends Handler{
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case MyConstants.MSG_FROM_CLIENT :
                        Log.i(TAG,"rec from client : " + msg.getData().getString("msg"));
                        // 回复客户端
                        Messenger messenger = msg.replyTo;
                        Message message = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);
                        Bundle data = new Bundle();
                        data.putString("msg","我已收到");
                        message.setData(data);
                        try {
                            messenger.send(message);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                        break;
                    default:
                        super.handleMessage(msg);
                }
            }
        }
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            // 返回Messenger底层的Binder对象.
            return mMessenger.getBinder();
        }
        // 根据Handler创建Messenger
        private final Messenger mMessenger = new Messenger(new MessengerHandler());
    }
    

    客户端关键代码

    public class MessengerActivity extends AppCompatActivity {
    
        private static final String TAG = "MessengerActivity";
        /**
         * 向服务端发送数据的Messenger
         */
        private Messenger mService ;
        private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // 根据获得Binder创建Messenger对象
                mService = new Messenger(service);
                Message msg = Message.obtain(null,MyConstants.MSG_FROM_CLIENT);
                Bundle data = new Bundle();
                data.putString("msg","hello this is client !");
                msg.setData(data);
                // 将Messenger设置
                msg.replyTo = mReplyMessenger;
                try {
                    mService.send(msg);
                } 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);
            Intent intent = new Intent(MessengerActivity.this, MessengerService.class);
            bindService(intent,mConnection,BIND_AUTO_CREATE);
        }
    
        @Override
        protected void onDestroy() {
            unbindService(mConnection);
            super.onDestroy();
        }
    
        private Messenger mReplyMessenger = new Messenger(new MessengerReplyHandler());
        /**
         * 接收服务端响应的Handler
         */
        private static class MessengerReplyHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case MyConstants.MSG_FROM_SERVICE :
                        Log.i(TAG,"reply from server : " + msg.getData().get("msg"));
                        break;
                    default:
                        super.handleMessage(msg);
                }
            }
        }
    }
    

    备注 : Android开发艺术探索

    相关文章

      网友评论

          本文标题:Android进程间通信--Messenger

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