Android高級(jí)進(jìn)階:WebView java與JavaScript交互詳解

手把手教小白實(shí)現(xiàn)WebView中java與js的交互:

java調(diào)用js方法一:

效果圖:


java調(diào)用js.png

shopping.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="utf-8">
    <title id="title">Title</title>
</head>
<script language="JavaScript">
       // Android需要調(diào)用的方法
       function callJS(){
          alert("Android調(diào)用了JS的callJS方法");
       }    
</script>
<body>
<dir>WebView</dir>
</body>
</html>

第一步:在assets目錄中添加shopping.html文件。

第二步:在activity中加載WebView組件,并加載html

avtivity.java

        webView.loadUrl("file:///android_asset/shopping.html");
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                new AlertDialog.Builder(view.getContext()).setTitle("提示").setMessage(message).show();
                return true;
            }
        });
        mTvBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.loadUrl("javascript:callJS()");
            }
        });

注意點(diǎn):

1、通過(guò)setJavaScriptEnable(true) 讓W(xué)ebView支持JavaScript
2、setJavaScriptCanOpenWindowsAutomatically(true)開(kāi)啟彈窗
3、在A(yíng)ndroid中需要重寫(xiě)js的Alert(),Confirm(),Prompt(),否則會(huì)遇到無(wú)法開(kāi)啟彈窗的問(wèn)題。

java調(diào)用js方法二:

注意:evaluateJavascript中不需要添加javascript修飾js的方法

  mTvBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                webView.loadUrl("javascript:callJS()");
                
                // todo evaluateJavascript中不需要添加javascript修飾js的方法
                webView.evaluateJavascript("callJS()", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        Toast.makeText(ShoppingActivity.this,value,Toast.LENGTH_LONG).show();
                        mTvBtn.setText(value);
                    }
                });
            }
        });

差異:evaluateJavascript可以獲得js的返回值,但是只支持4.4及以上Android版本

js調(diào)用java方法一:

JS調(diào)用Android代碼.png

H5這邊

shopping.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="utf-8">
    <title id="title">Title</title>
</head>
<script language="JavaScript">
       // Android需要調(diào)用的方法
       function callJS(){
          alert("Android調(diào)用了JS的callJS方法");
       }
       function callAndroid(){
          javaObject.showToast('JS 喚起Android Toast')
       }
</script>
<body>
<text>WebView</text>
<button type="button" id="button1" onclick="callAndroid()">喚起Android toast</button>
</body>
</html>

h5中js函數(shù)內(nèi)通過(guò)約定類(lèi)名和方法調(diào)用java代碼: javaObject.showToast('JS 喚起Android Toast')

Android這邊

創(chuàng)建約定類(lèi):JavaObject.java

public class JavaObject {

    private final Context mContext;

    public JavaObject(Context context) {
        mContext = context;
    }

    @JavascriptInterface
    public void showToast(String msg) {
        Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
    }
}

在activity中添加java和js的鏈接橋梁,name要與js中的一致

webView.addJavascriptInterface(new JavaObject(this),"javaObject");

js調(diào)用java方法二:

通過(guò)復(fù)寫(xiě)WebViewClient中shouldOverrideUrlLoading的方法,并約定js中的URL協(xié)議

   webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Uri uri = Uri.parse(url);
                if ("js".equals(uri.getScheme())){
                    if ("webView".equals(uri.getAuthority())) {
                        Set<String> params = uri.getQueryParameterNames();
                    }
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

特點(diǎn):

優(yōu)點(diǎn):不存在方式1的漏洞;
缺點(diǎn):JS獲取Android方法的返回值復(fù)雜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容