Android与Javascript互相调用

作者: 蜡笔小州 | 来源:发表于2017-11-08 16:39 被阅读240次
    介绍

    在android开发项目中,我们经常会将一些功能放在html中,比如一些活动界面,版权界面之类的,或者分了分流一下视频区的流量,可能会在流量大的时候,打开web的接口。这时我们知道使用html界面要用到webview,而使用android时也需要注意与非源生的交互,就是android和js的互相调用。

    配置
    webView.getSettings().setJavaScriptEnabled(true);
    
    webView.loadUrl("file:///android_asset/web.html");
    

    这里首先让webview支持javascript,然后作为demo直接加载本地的html。

    android调用js方法

    直接在onclick事件中写

    webView.loadUrl("javascript:javacalljs()");
    
    webView.loadUrl("javascript:javacalljswith(" + "'参数'" + ")");
                
    

    string就是js的方法名。
    对应js的代码

    function javacalljs(){
         document.getElementById("content").innerHTML =
             "<br\>JAVA调用了JS的无参函数";
    }
    
    function javacalljswith(arg){
         document.getElementById("content").innerHTML =
             ("<br\>"+arg);
    }
    
    js调用java

    我们先看下js代码

    <input type="button"  value="js调用java" onclick="window.android.startFunction()" />
    
    <input type="button"  value="js调用java传递参数" onclick="window.android.startFunction('参数')"  />
    

    在android中我们需要使用addJavascriptInterface方法添加js的方法。

    webView.addJavascriptInterface(MainActivity.this, "android");
    

    android就是js中对应的命名空间
    以下我们可以直接在MainActivity里面写注解方法:

        @JavascriptInterface
        public void startFunction(final String text) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
    
                }
            });
        }
    
        @JavascriptInterface
        public void startFunction() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
    
                }
            });
        }
    

    或者我们将js方法全部写在一个类里面,比如JsonObject。
    实例化的时候将 context和handler传过去,用于上下文和回调。

    jsObject = new JsObject(MainActivity.this,mHandler);
    

    在添加接口时将对象传入:

    webView.addJavascriptInterface(jsObject, "android");
    

    然后直接在jsonObject类下写注解方法即可,再用handler回调,这样方便管理。

    其他

    如果我们多次addJavascriptInterface的时候,在对象不同的情况下,比如我们先

    webView.addJavascriptInterface(MainActivity.this, "android");
    

    webView.addJavascriptInterface(jsObject, "android");
    

    那么只有后面的生效,前面的被覆盖。
    但是我们要增加多个空间的话

    webView.addJavascriptInterface(MainActivity.this, "android");
    
    webView.addJavascriptInterface(MainActivity.this, "java");
    

    这样是可行的,俩个均有效果。

    转载请注明出处:http://www.jianshu.com/p/f5c77a655ea6

    相关文章

      网友评论

        本文标题:Android与Javascript互相调用

        本文链接:https://www.haomeiwen.com/subject/pahymxtx.html