神州教育培训网 打造高端培训课程,传播精品教育理念! 神州教育 神州培训 教育 企业培训 企业内训 企业管理 研修课程 简章 资本运作 房地产 国学 名师推荐

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

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

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

1
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后执行:

posted on   努力&快乐  阅读(5171)  评论(1编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
神州教育培训网 打造高端培训课程,传播精品教育理念! 神州教育 神州培训 教育 企业培训 企业内训 企业管理 研修课程 简章 资本运作 房地产 国学 名师推荐
点击右上角即可分享
微信分享提示