【Android】Messenger

1,概述

Messenger是对AIDL的封装,用于进程间通信,通过源码可以发现这点。

private final class MessengerImpl extends IMessenger.Stub {

    public void send(Message msg) {
        msg.sendingUid = Binder.getCallingUid();
        Handler.this.sendMessage(msg);
    }
}

2,简单实例

服务端

public class MessengerService extends Service {

    public static final String TAG = "MessengerService";

    private final Messenger mMessenger = new Messenger(new MessengerHandler());

    @Override

    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }

    private static class MessengerHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constant.MESSAGE_FROM_CLIENT:

                    Log.d(TAG, "receive msg from client : " + msg.getData().getString("msg"));                                                                         
                    break;

                default:
                    super.handleMessage(msg);

            }
        }
    }
}

客户端

//Messenger  ----> Service

startService(Intent(this, MessengerService::class.java))
bindService(Intent(this, MessengerService::class.java), MyServiceConnect2(), 0)                                                                            

private inner class MyServiceConnect2 : ServiceConnection {

override fun onServiceConnected(name: ComponentName?, service: IBinder?) {

    mMessenger = Messenger(service)
    val message = Message.obtain().apply {
        what = Constant.MESSAGE_FROM_CLIENT
        data = Bundle().apply {
            putString("msg", "hello,this is client")
        }
    }

    try {
        mMessenger.send(message)
        Log.d(TAG, "onServiceConnected: send ${message.data.getString("msg")}")
    } catch (e: RemoteException) {
        e.printStackTrace()
    }
}

override fun onServiceDisconnected(name: ComponentName?) {
}
}

AndroidManifest.xml定义

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


日志

2021-10-13 16:16:25.033 14318-14318/com.zjw.source D/MessengerService: receive msg from client : hello,this is client     


走读源码

可以看到,就是继承IMessager.Stub,所以本质是封装了AIDL,方便于进程间通信。 其中只有一个send方法。

Handler中封装好了MessengerImpl,其getIMessenger方法如下,

final IMessenger getIMessenger() {

    synchronized (mQueue) {
        if (mMessenger != null) {
            return mMessenger;
        }
        mMessenger = new MessengerImpl();
        return mMessenger;
    }
}


private final class MessengerImpl extends IMessenger.Stub {
    public void send(Message msg) {
        msg.sendingUid = Binder.getCallingUid();
        Handler.this.sendMessage(msg);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值