美文网首页
AMessenger 轻量跨进程通信组件

AMessenger 轻量跨进程通信组件

作者: 风风风筝 | 来源:发表于2019-10-30 18:11 被阅读0次

    AMessenger

    AMessenger 是一个有跨进程能力的 Handler,特点是非常轻巧

    使用方法

    1、初始化

    AMessenger.getInstance().init(this);
    

    2、每个进程注册要处理的事件

    if (Util.isMainProcess(this)) {
        AMessenger.getInstance().register(new MainMessengerHandler(), 111);
    } else if (Util.isPlayerProcess(this)) {
        AMessenger.getInstance().register(new PlayerMessengerHandler(), 222, 333);
    } else if (Util.isDownloadProcess(this)) {
        AMessenger.getInstance().register(new DownloadMessengerHandler(), 222, 333);
    }
    

    [AMessenger.java]

    public void register(AHandler handler, int... whats)
    

    每个进程可以注册任意个 AHandler(通常一个就够了) 和 what(通常会有多个)

    3、发送消息

    AMessage aMessage = new AMessage(222);
    aMessage.putParcelable("user", user);
    AMessenger.getInstance().sendMessage(aMessage);
    
    AMessenger.getInstance().sendEmptyMessage(333);
    

    4、处理消息

    public class PlayerMessengerHandler extends AHandler {
        @Override
        public void handleMessage(AMessage aMessage) {
            if (aMessage.what == 222) {
                Log.d("AMessenger", "log in " + aMessage.getParcelable("user", User.CREATOR));
            } else if (aMessage.what == 333) {
                Log.d("AMessenger", "log out");
            }
        }
    }
    

    原理

    很显然是基于 Messenger 实现的
    1、AMessenger init 时每个进程都会创建一个 Messenger
    2、非主进程 bind 主进程的 HubService,onBind 返回主进程的 Messenger
    3、在 onServiceConnected 中通过主进程的 Messenger 将自己的 Messenger 发给主进程(sendMsg0),这样主进程就拥有所有进程的 Messenger
    4、之后所有进程之间的消息都先发给主进程再进行转发

    private void sendMsg0() {
        if (mIsMainProcess || mHubMessenger == null) {
            return;
        }
        Message msg0 = Message.obtain();
        msg0.what = Integer.MIN_VALUE;
        msg0.replyTo = mMessenger;
        msg0.getData().putString("process", mProcess);
        msg0.getData().putIntArray("whats", getWhats());
        try {
            mHubMessenger.send(msg0);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    

    相关文章

      网友评论

          本文标题:AMessenger 轻量跨进程通信组件

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