基于Weex的跨端方案

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

2018-11-13  本文已影响248人  Meteorwizard

在同一个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页面间消息传递时序图
上一篇下一篇

猜你喜欢

热点阅读