Android-Java和JavaScript互相挪用

当前的Android开辟中,会运用大批的h5(html5+css3+js),以至涌现了夹杂开辟形式(Hybrid),运用Hybrid开辟,h5页面开辟效率高和移植便利性为主。
但在一些处所运用h5开辟确实会不太轻易完成,这个时刻就须要挪用Java原生要领来完成,就会碰到JavasSript和Java互相挪用,用Java原生要领完成那些Javascript代码不轻易完成的功用,比方,异步线程,挪用数据库等….. 然后再暴露给JavaScript挪用。

JavascriptInterface

Android 4.2之前运用addjavascriptinterface能够把原生的Java要领,给JavaScript挪用,然则这类计划却存在平安风险,在页面中实行一些不可托的Javascript代码即有能够掌握用户的手机,概况见:WebView中接口隐患与手机挂马应用
Android 4.2以后供应了@JavascriptInterface对象注解的体式格局竖立Javascript对象和android原生对象的绑定,供应给JavaScript挪用的要领必需带有@JavascriptInterface
当前4.0及4.0之前的体系市场占有量已很低了,因而能够斟酌运用minSdkVersion为17,只支撑4.2版本以上的手机,低版本的体系不再支撑了。
下面就看下Java和Javascript是怎样通讯的。

加载当地html

为了方便运用,下面运用的示例,不会运用server,所以就须要在webview中运用当地的html文件,为了方便把html文件都放在assets文件夹中,运用当地加载的体式格局,如许就不须要服务器的支撑了。
先定义一个html文件:

<!DOCTYPE html>
<html>
    <body>
        <h1>this is html</h1>
    </body>
</html>

运用file:///android_asset/index.html加载到webview中:

    private void initView() {
        webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("file:///android_asset/index.html");
    }

下面就能够在index.html中试用Java和JavaScript的挪用了。

Javascript挪用Java要领

以Android的Toast的为例,下面看下怎样从Javascript代码中挪用体系的Toast
先定义一个AndroidToast的Java类,它有一个show的要领用来显现Toast:

public class AndroidToast {
        @JavascriptInterface
        public void show(String str) {
            Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
        }
    }

再对WebView举行设置,开启JavaScipt,注册JavascriptInterface的要领:

private void initView() {
        webView = (WebView) findViewById(R.id.webView);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDefaultTextEncodingName("UTF-8");
        webView.addJavascriptInterface(new AndroidToast(), "AndroidToast");
        webView.loadUrl("file:///android_asset/index.html");
 }

addJavascriptInterface的作用是把AndroidToast类映照为Javascript中的AndroidToast。如许就能够在JavaScript中挪用Java中的要领了。
在Javascript中挪用Java代码:

function toastClick(){
        window.AndroidToast.show('from js');
}

经由过程window属性能够找到映照的对象AndroidToast,直接挪用它的show要领即可。
注重这里传输的数据只能是基础数据类型和string,能够传输string就意味着能够运用json传输结构化数据。
这里挪用的要领并没有返回值,假如须要在JavaScript中须要获得返回值怎么办呢?

JavaScript挪用Java有返回值

假如想从Javascript调的要领内里获取到返回值,只须要定义一个带返回值的@JavascriptInterface要领即可:


    public class AndroidMessage {
        @JavascriptInterface
        public String getMsg() {
            return "form java";
        }
    }

增加Javascript的映照:

webView.addJavascriptInterface(new AndroidMessage(), "AndroidMessage");

在JavaScript直接挪用:

function showAlert(){
        var str=window.AndroidMessage.getMsg();
        console.log(str);
 }

如许就完成了有返回值的要领挪用。另有一种场景是,在Java中主动触发JavaScript要领,就须要在Java中挪用JavaScript要领了。

Java挪用JavaScript要领

Java在挪用JavaScript要领的时刻,须要运用WebView.loadUrl()要领,它能够直接在页面里实行JavaScript要领。
起首定义一个JavaScript要领给Java挪用:

function callFromJava(str){
        console.log(str);
    }

在Java中直接挪用该要领:

public void  javaCallJS(){
        webView.loadUrl("javascript:callFromJava('call from java')");
    }

能够在loadUrl中给Javascript要领直接传参,假如JavaScript要领有返回值,运用WebView.loadUrl()是没法获取到返回值的,须要JavaScript返回值给Java的话,能够定义一个Java要领供应给JavaScript挪用,然后Java挪用JavaScript以后,JavaScript触发该要领把返回值再传递给Java。
注重WebView.loadUrl()必需在Ui线程中运转,不然会会报错。

项目地点:https://github.com/jjz/androi…

    原文作者:姜家志
    原文地址: https://segmentfault.com/a/1190000004895840
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞