第一篇文章中,已经粗略讲述了,安卓中集成weex sdk的方法;
这种情况一般用于在安卓程序中,部分界面使用轻应用,所以集成weex来代替webview实现部分网页的功能;android回调weex android调用weex — weex android交互
这片文章讲述下,js如何调用android native的功能,及natvie如何主动调用js的函数。
weex已经提供了一些功能,但是有一些比如:获取mac地址、封装一些natvie的自带播放功能给js使用,则需要提供js调用native的功能;当然,natvie有时候做完一些事情后,也需要主动调用js函数,告诉js接下来的动作。
**
第一部分,js调用natvie
**
参考官网,添加wxmodule模块。
总结一下 native中要改动两个文件,js中直接使用:
**
1.创建新的模块XXModule 继承WXModule
**
在此模块中增加接口,并增加注释;例如:
public class MyModule extends WXModule {
//run ui thread
@JSMethod (uiThread = true)
public void printLog(String msg) {
Toast.makeText(mWXSDKInstance.getContext(),msg,Toast.LENGTH_SHORT).show();
}
//run JS thread
@JSMethod (uiThread = false)
public void fireEventSyncCall(){
//implement your module logic here
}
}
2.在application中注册此模块:
public class WXApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
WXSDKEngine.addCustomOptions("appName", "WXSample");
WXSDKEngine.addCustomOptions("appGroup", "WXApp");
WXSDKEngine.initialize(this,
new InitConfig.Builder().setImgAdapter(new ImageAdapter()).build()
);
try {
WXSDKEngine.registerModule("MyModule", WXEventModule.class);//这里注册MyModule
} catch (WXException e) {
e.printStackTrace();
}
**
3.js中使用
**
<template>
<div>
<text onclick="click">testMyModule</text>
</div>
</template>
<script>
module.exports = {
methods: {
click: function() {
weex.requireModule('MyModule').printLog("I am a weex Module");//这里使用MyModule中的printLog函数,并传递参数;
}
}
}
</script>
第一部分到此为止,下面讲述,natvie如何调用js呢?
**
第二部分,natvie调用js
**
weex中提供了一个JSCallBack的机制,和webview的不同,webview的使用方式不在介绍。
这里有个点,就是natvie要调用js,还是要知道调用js哪个函数,所以是需要js先调用natvie,并把回调的函数名字告诉native,然后native就可以在需要的时候进行回调了。
下面的例子是:调用自定义的module模块中函数,获取mac地址,当获取到MAC地址后呢,回调js,js在进行toast提示。
例如:
var modal = weex.requireModule('MyModule');
modal.getDeviceMac(function (string){
//调用nativie中的方法打日志,得出回调成功了
modal.printLog(string);
});
这里,调用了natvie的MyModule
模块的getDeviceMac
函数,并传递了回调函数,只不过函数没起名字,这没有什么影响。
接下来看native如何处理:
@JSMethod(uiThread = false)
public void getDeviceMac(JSCallback jsCallback) {
jsCallback.invoke(SystemUtils.getWlanMac());
}
可以看到,回调的方法是:jsCallback.invoke()
,还有一个jsCallback.invokeAndKeepAlive();
这个是一直回调,一般使用前者即可。
其中invoke
中可以携带参数(上面示例中带的string
参数),定义如下:
public interface JSCallback {
/**
* invoke javascript callback method, this method will destoryed after invoke.
* @param data
*/
void invoke(Object data);
/**
* invoke javascript callback method and keep callback alive for later use.
* @param data
*/
void invokeAndKeepAlive(Object data);
}