美文网首页
简单的使用Messenger跨进程通信

简单的使用Messenger跨进程通信

作者: NewHigh | 来源:发表于2017-10-24 13:32 被阅读33次
    • 正常的使用Service,我们都是在ServiceConnection的回调中强转成自己的service,
      • 下面这种是没有在xml中开启进程的,这样使用没有问题。
      private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder iBinder) {
                ProcessService processService  = (ProcessService) iBinder;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    
    
    • 但是如果在xml中添加android:process="xxxx" 后 ,上面的方法就不可以用了!

    • 那就需要使用Messenger,而且Messenger在开进程或者不开进程中都可以使用,所以建议使用Messenger进行活动与service间的通信,而且使用起来也简单

    • 首先需要在service中创建对象,需要一个Handler来进行链接

        public static final int MSG_1 = 1;
        public static final int MSG_2 = 2;
        public static final int MSG_3 = 3;
    
        private Messenger mMessenger = new Messenger(mHandler);
    
        private static Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
    
                switch (msg.arg1) {
                    case MSG_1:
                        String msg1 = msg.getData().getString("msg");
                        L.d( " msg 1 " + msg1);
                        break;
                    case MSG_2:
                        L.d( " msg 2 ");
                        break;
                    case MSG_3:
                        L.d( " msg 3 ");
                        break;
                    default:
                        break;
                }
    
            }
        };
    //在onBind的回调中写上Messenger的binder
     @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return mMessenger.getBinder();
        }
    //好了,service中的代码这样就算完成了
    
    
    
    • 然后就是activity中的代码
    //首先绑定服务
      bindService(new Intent(this , ProcessService.class) , mConnection , Context.BIND_AUTO_CREATE );
    //然后就是在ServiceConnection的回调中得到Messenger的对象
    
      private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder iBinder) {
    
                mMessenger = new Messenger(iBinder);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    //得到Messenger的对象就可以使用它进行发送信息了,它需要一个message对象。
     public void btnOnClick(View view){
            Message message = new Message();
            message.arg1 = ProcessService.MSG_1;
            message.getData().putString("msg" , "this is msg");
            try {
                mMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
    
        }
    
    
    • 这样不管xml中开了进程或者没有开,都可以用上面的方法进行与服务之间的简单通信

    相关文章

      网友评论

          本文标题:简单的使用Messenger跨进程通信

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