美文网首页
简单的使用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