Android——Messenger

Messenger介绍

Messenger是一种轻量级IPC方案,它的底层实现是AIDL,可以在不能进程之间进行数据传输

服务端

创建一个Service,在Handler中处理消息,在onBind中返回Messenger对象的Binder

public class MessengerService extends Service {
    private static final String TAG = "MessengerService";

    public static final int MESSAGE_FROM_CLIENT = 20;
    @Nullable
    @Override
    //返回Binder
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
    private final Messenger messenger = new Messenger(new MessengerHandle());

    private static class MessengerHandle extends Handler{

        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case MESSAGE_FROM_CLIENT:
                    //接受来自客户端的消息
                    Log.d(TAG,"" + msg.getData().getString("msg"));
                    Messenger client = msg.replyTo;
                    Message RelpyToMessage = Message.obtain(null,MainActivity.MESSAGE_FROM_SERVICE);
                    Bundle ServiceBundle = new Bundle();
                    ServiceBundle.putString("reply","Hi! Client");//返回消息至客户端
                    RelpyToMessage.setData(ServiceBundle);
                    try{
                        client.send(RelpyToMessage);
                    }catch (RemoteException e){
                        e.printStackTrace();
                    }
                    break;
            }
            super.handleMessage(msg);
        }
    }
}

在清单文件中配置Service

<service
            android:name=".MessengerService"
            android:process=":remote"
            android:enabled="true"
            android:exported="true"/>

客户端

首先绑定服务端的Service,然后根据IBinder创建一个Messenger对象,然后在绑定名称向客户端发送消息,依旧在Handler处理服务端的消息

public class MainActivity extends AppCompatActivity{
    private static final String TAG = "MainActivity";
    public static final int MESSAGE_FROM_SERVICE = 10;//客户端发送给服务端
    private Messenger messenger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(MainActivity.this,MessengerService.class);
        bindService(intent,connection,BIND_AUTO_CREATE);

    }

    @Override
    protected void onDestroy() {
        unbindService(connection);
        super.onDestroy();
    }
    private  Messenger myMessenger = new Messenger(new MessengerHandle());
    //连接Service并发送消息
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            messenger =new Messenger(service);
            Message message = Message.obtain(null, MessengerService.MESSAGE_FROM_CLIENT);
            Bundle bundle = new Bundle();
            //第一次向Service打招呼
            bundle.putString("msg","Hi! Service");
            message.setData(bundle);
            //接收客户端信息时,需要把服务端的Messenger通过replyTo参数传递给服务端
            message.replyTo = myMessenger;
            try{
                messenger.send(message);
            }catch (RemoteException e){
                e.printStackTrace();
            }
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    //接收Service的消息
    private static class MessengerHandle extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
           switch (msg.what){
                case MESSAGE_FROM_SERVICE:
                   Log.d(TAG,msg.getData().getString("reply"));
                   break;
            }
        }
    }
}

效果展示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/News53231323/article/details/114084402