跨进程通讯之Binder通讯

一、oneway、in、out、inout关键字讲解

1、oneway:异步执行,不管服务器有没有执行完,直接返回

2、in:数据只能由客户端流入服务端

3、out:数据只能由服务端流出到客户端

4、inout:数据可以在服务端与客户端之间双向流通

二、Binder双向通讯思路

客户端跟服务端通讯其实是获取到服务端的IBinder对象,以此来操作服务端,

那么客户端也同理可以传递给服务端一个IBinder对象,以此来实现服务端操作客户端

三、linktodeath作用

客户端跟服务端双向通讯时,当服务端crash了,能够受到回调

DeathRecipient deathHandle = new DeathRecipient() {

@Override

public void binderDied() {

// TODO Auto-generated method stub

Log.i(TAG, "binder is died");

}

};

service.linkToDeath(deathHandle, 0);

四、messenger(原理其实就是基于aidl实现的简化版aidl跨进程通讯)

1、服务端对Messenger的使用

服务端需要实现一个Handler用于处理客户端发来的跨进程通信信息:

其次服务端构造出对应的Messenger:

服务端构造:

Messenger messenger = new Messenger(messengerHandler);

注意这里参数是messengerHandler即一个Handler

最后,当服务端的onBinder回调时候要返回Messenger的IBinder对象给客户端

    @Nullable

    @Override

    public IBinder onBind(Intent intent) {

        return messenger.getBinder();

    }

2、客户端的使用

客户端还是和以前一样通过bindService在ServiceConnection类的onServiceConnected获取到服务端的返回的IBinder,从而获取到服务端的Messenger代理类,调用send函数发送Message。所以Messenger能发送的信息只有Message能携带的信息。

Intent intent = new Intent(MainActivity.this,MessengerService.class);

                Log.i("test","MessengerService  onClick ");

                bindService(intent, new ServiceConnection() {

                    @Override

                    public void onServiceConnected(ComponentName name, IBinder service) {

                        try {

                            Log.i("test","MessengerService  onServiceDisconnected name = " +name);

                            messengerServer = new Messenger(service);

                            sendMessageToServer();

                        } catch (Exception e) {

                            e.printStackTrace();

                            Log.i("test","error " ,e);

                        }

                    }

                    @Override

                    public void onServiceDisconnected(ComponentName name) {

                        Log.i("test","client onServiceDisconnected name = " +name);

                    }

                }, BIND_AUTO_CREATE);

    void sendMessageToServer() throws RemoteException {

        Message toServer = Message.obtain();

        toServer.replyTo = messengerClientSend;

        toServer.what = 1;

        //toServer.obj = "hello I send from client"; 注意不可以 传递非parcel的对象,这个只能给obj赋值为parcel类型对象否则报错

        Bundle bundle = new Bundle();

        bundle.putString("bundleKey","bundleValue Client");

        toServer.setData(bundle);

        messengerServer.send(toServer);

    }

(messenger)使用链接-https://blog.csdn.net/learnframework/article/details/119845833

猜你喜欢

转载自blog.csdn.net/professionIT/article/details/132859983