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后执行:
  • 相关阅读:
    Axel linux下多线程下载工具
    使用Scala编写Spark程序求基站下移动用户停留时长TopN
    编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
    使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
    Eclipse上Hadoop插件中Run On Hadoop原理[转]
    apache官方中文hadoop说明文档地址
    如何在Windows下面运行hadoop的MapReduce程序
    通过web界面查看hadoop集群运行日志的地址
    linux命令-查看当前目录下所有文件的大小:“ll -h”
    BZOJ3979 : [WF2012]infiltration
  • 原文地址:https://www.cnblogs.com/Sandheart/p/5334058.html
Copyright © 2011-2022 走看看