cordova混合开发:Android中native调用javascript

时间:2022-09-02 08:43:46

今天学习怎么在java中调用javascript方法,做个记录:

第一种方式,这个最简单:

loadUrl("javascript:func1()");

要注意要在deviceready后调用,否则会报方法未定义的错误:"Uncaught ReferenceError: fun1 is not defined";

第二种方式:注册一个通道,在native中向js发送回调,这也是新版cordova推荐的方法:

javascript:

function myinit(){
alert('12355');
} //最省事的就是找个现成的插件添加个函数"callJSInit",能执行注册就可以,或者在cordova_plugins.js里注册一个单独的插件模块,见注1;
cordova.define("插件模块ID", function(require, exports, module) {
var exec = require('cordova/exec');
var callJS = {
init:function() {
cordova.require('cordova/channel').onCordovaReady.subscribe(function(){
exec(succeedCallback, null, "PluginName", "callJSInit", []);
function succeedCallback(message){
//执行js代码
eval(message);
//还可以这样,大胆的发挥你的想象力
/*
if(message=='f1')
alert(1);
else if(message == 'f2')
alert(2);
……
*/         
}
});
}
}; module.exports = callJS;
}); //注1:在cordova_plugins.js里注册一个单独的插件模块
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
//添加:
{
"file": "js文件路径",
"id": "插件模块",
"clobbers": ["navigator.callJS"]
}
]
} //在app deviceready后执行:
navigator.callJS.init()

java文件:

public class PluginName extends CordovaPlugin {
private static CallbackContext mCallbackContext; @Override
public boolean execute(String action, final JSONArray args,
final CallbackContext callbackContext) throws JSONException {
if (action.equals("callJSInit")) {
mCallbackContext = callbackContext; //拿到回调对象并保存
//PluginResult dataResult = new PluginResult(PluginResult.Status.OK, "calljs init ready");
//dataResult.setKeepCallback(true);// 非常重要
//mCallbackContext.sendPluginResult(dataResult);
return true;
} else {
return false;
}
} @Override
public Object onMessage(String id, Object data) {
return null;
} public static void callJS(String message) {
if (mCallbackContext != null) {
PluginResult dataResult = new PluginResult(PluginResult.Status.OK, message);
dataResult.setKeepCallback(true);// 非常重要
mCallbackContext.sendPluginResult(dataResult);
}
}
}

在其它java文件中调用js:

PluginName.callJS("myinit()");

运行app就会显示"myinit"方法中的内容了。

//在app deviceready后执行: