在同一个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页面间消息传递时序图
网友评论