实现目的:hbuilder,js方法调用原生方法,原生方法不是立即返回结果,某一时刻得到结果再传回给js,是一个异步的过程,如js调用原生的相机功能,原生完成一系列操作后,再把结果返回给js,是一个异步的过程。资料参考
官方文档 Android平台第三方插件开发指导 https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/66
异步返回JS扩展方法实现
在实现异步扩展方法时,开发者需要调用JS Plugin Bridge的plus.bridge.exec()方法,该方法会通知Native层插件执行指定方法,运行结果会通过回调的方式通知JS层
void plus.bridge.exec( String service, String action, Array args );
service: 插件类别名
action: 调用Native层插件方法名称。
args: 参数列表。
如何实现原生与hbuilder的交互,步骤如下:
1.自定义一个插件
<properties>
<features>
<feature name="Barcode"
<feature name="pluginbridge" value="com.lianyucn.szfjzxy.ui.hbuilder.PluginBridge"/>
</features>
</properties>
2.编写相互调用的js文件,test.js代码如下
document.addEventListener( "plusready", function()
{
var _BARCODE = 'pluginbridge',
B = window.plus.bridge;
var plugintest =
{
PluginTestFunctionArrayArgu : function (Argus, successCallback, errorCallback )
{
var success = typeof successCallback !== 'function' ? null : function(args)
{
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code)
{
errorCallback(code);
};
callbackID = B.callbackId(success, fail);
return B.exec(_BARCODE, "webToPickPhoto", [callbackID, Argus]);
}
};
window.plus.plugintest = plugintest;
}, true );
注意 exec 才是异步,,execSync 是同步。本例子异步
3.原生java代码
public class PluginBridge extends StandardFeature {
private volatile static PluginBridge mInstance = new PluginBridge();
private IWebview pWebview;
private String CallBackID;
public static PluginBridge getInstance() {
return mInstance;
}
public void webToPickPhoto(IWebview pWebview, JSONArray array){
mInstance.pWebview = pWebview;
mInstance.CallBackID = array.optString(0);
JSONArray newArray = null;
try {
newArray = new JSONArray( array.optString(1));
String inValue1 = newArray.getString(0);
String inValue2 = newArray.getString(1);
String inValue3 = newArray.getString(2);
String inValue4 = newArray.getString(3);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
loadJs("返回给js的值是 哈哈哈哈");
}
public void loadJs(String param){
JSUtil.execCallback(mInstance.pWebview, mInstance.CallBackID, param, JSUtil.OK, false);
}
}
4.引入test.js,,调用原生方法
js代码
<script src="js/test.js"></script>
plus.plugintest.PluginTestFunctionArrayArgu(["Html5","Plus","SyncFunction","MultiArgument!"],
function( result ) {
alert( result );
},function(result){
alert(result)
});
以上步骤做完,原生就可以跟hbuidler进行相互交互。