zoukankan      html  css  js  c++  java
  • cordova混合开发:Android中native调用javascript

    今天学习怎么在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后执行:
  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/Sandheart/p/5334058.html
Copyright © 2011-2022 走看看