美文网首页基于Weex的跨端方案
Weex页面间的消息机制(Android端实现)

Weex页面间的消息机制(Android端实现)

作者: Meteorwizard | 来源:发表于2018-11-13 17:48 被阅读248次

    在同一个Weex页面中,我们可以使用globalEvent来做消息转发,但是如果涉及到了跨页面的通信,则只使用Weex端技术比较难实现(通过全局变量算一种实现)。因此我们需要通过从native层中转一次消息来辅助实现。在Android里已经有很多成熟的全局通知机制,如经典的EventBus以及原生的LocalBroadcast。考虑到尽量减少对第三方库的依赖,我们采用了LocalBroadcast的形式。

    Weex的native扩展方式之一——Module,是这个消息机制的核心组成部分,每个页面都有一个自己的Module实例,因此我们可以新建一个Module来处理发送以及接受Event的逻辑。

    在Module中也提供了对于Activity的生命周期的hook,所以我们可以很方便的在Module中处理本地广播的注册、注销等逻辑。

    在这里碰到了一个坑,Module对于Activity生命周期的hook,需要手动调用在Activity里创建的WXSDKInstance的生命周期回调方法。如想要hook生命周期中的onCreate,则需要调用如下代码:

     if (mInstance != null) {
         mInstance.onActivityCreate();
     }
    

    然后在WXSDKInstance的onActivityCreate中会去调用Module的onActivityCreate:

     @Override
      public void onActivityCreate() {
    
        // module listen Activity onActivityCreate
        WXModuleManager.onActivityCreate(getInstanceId());
        ...
      }
    
    public static void onActivityCreate(String instanceId){
    
        Map<String, WXModule> modules = sInstanceModuleMap.get(instanceId);
        if(modules!=null) {
          for (String key : modules.keySet()) {
            WXModule module = modules.get(key);
            if (module != null) {
              module.onActivityCreate();
            } else {
              WXLogUtils.w("onActivityCreate can not find the " + key + " module");
            }
          }
        }
    
      }
    

    这里有一个坑,就是在Activity的onCreate里如果直接调用WXSDKInstance的onCreate,则这时候Module还未被注册到WXSDKInstance中,因此这时候不会触发Module的onActivityCreate,目前我的做法是将WXSDKInstance的onCreate调用放到onRenderSuccess中。具体原因还有待确认。

    然后在Module的onActivityCreate中我们可以做本地广播的注册操作,在onActivityDestroy中做注销操作。

    具体的消息首发逻辑可以参考以下时序图:


    Weex页面间消息传递时序图

    相关文章

      网友评论

        本文标题:Weex页面间的消息机制(Android端实现)

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