日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Android?WebView開(kāi)發(fā)之WebView與Native交互_Android

作者:紅日666 ? 更新時(shí)間: 2022-02-20 編程語(yǔ)言

前言

附GitHub源碼:WebViewExplore

一、JS調(diào)用Native的三種方式

1、通過(guò)WebView的addJavascriptInterface進(jìn)行對(duì)象映射

需要注意的是這種調(diào)用方式,如果你的 minSdkVersion <=16那么需要考慮到4.2之前的漏洞問(wèn)題。

mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
    /**
     * JS調(diào)用android原生方法1:
     *
     * 通過(guò)WebView的addJavascriptInterface()進(jìn)行對(duì)象映射
     */
    private class JsCallAndroidInterface {
 
        /**
         *@JavascriptInterface注解方法.
         * js端調(diào)用,4.2以后安全;4.2以前,當(dāng)JS拿到Android這個(gè)對(duì)象后,
         * 就可以調(diào)用這個(gè)Android對(duì)象中所有的方法,包括系統(tǒng)類(java.lang.Runtime 類)
         * 從而進(jìn)行任意代碼執(zhí)行。
         * @param msg
         */
        @JavascriptInterface
        public void callback(String msg) {
            ToastUtil.showToast(APIWebViewActivity.this, "JS方法回調(diào)到web了 :" + msg);
        }
    }

2、通過(guò)WebViewClient shouldOverrideUrlLoading方法回調(diào)攔截url:

與url重定向類似,可在此做url的攔截,已達(dá)到針對(duì)性的調(diào)用native方法的目的。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (resolveShouldLoadLogic(url)) {
        return true;
    }
    return super.shouldOverrideUrlLoading(view, url);
}
    /**
     * JS調(diào)用android原生方法2:
     *
     * 通過(guò)WebViewClient shouldOverrideUrlLoading方法回調(diào)攔截url
     *
     * 根據(jù)協(xié)議的參數(shù),判斷是否是所需要的url:
     * 一般根據(jù)scheme(協(xié)議格式),authority(協(xié)議名)來(lái)判讀
     *
     * @param url
     * @return
     */
    private boolean resolveShouldLoadLogic(String url) {
        Uri uri = Uri.parse(url);
        if (uri.getScheme().equals("js")) {
            if (uri.getAuthority().equals("Authority")) {
                ToastUtil.showToast(APIWebViewActivity.this, "方法2");
            }
            return true;
        }
        return false;
    }

3、通過(guò)WebChromeClient的 onJsPrompt()等方法 ,回調(diào)攔截JS對(duì)話框prompt()等:

        /**
         * 是否支持頁(yè)面中的js輸入彈出框
         *
         * @param view
         * @param url
         * @param message
         * @param defaultValue
         * @param result
         * @return
         */
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
                                  JsPromptResult result) {
            if (resolveJSPrompt(message)) {
                return true;
            }
            return super.onJsPrompt(view, url, message, defaultValue, result);
        }
    /**
     * JS調(diào)用android原生方法3:
     *
     * 通過(guò)WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法
     * 回調(diào)攔截JS對(duì)話框alert() confirm() prompt()
     */
    private boolean resolveJSPrompt(String message) {
        Uri uri = Uri.parse(message);
        if (uri.getScheme().equals("js")) {
            if (uri.getAuthority().equals("Authority")) {
                ToastUtil.showToast(APIWebViewActivity.this, "方法3");
            }
            return true;
        }
        return false;
    }

完整源碼

Js調(diào)用Native示例源碼-JsToNativeBridgeActivity

二、Native調(diào)用WebView的兩種方案

1、loadUrl("javascript:callJS()"):

此方法簡(jiǎn)潔、效率低。當(dāng)不需要返回值且對(duì)性能要求較低時(shí)可以考慮使用:

/**
* Native調(diào)用JS方法一:
* 方法簡(jiǎn)潔、效率低
* 當(dāng)不需要獲取返回值且對(duì)性能要求較低時(shí)可選擇使用。
*/
webView.loadUrl("javascript:callJS()");

2、evaluateJavascript(script,resultCallback):

需4.4以上才可使用,效率高且有返回值:

/**
 * Native調(diào)用JS方法二:
 * 效率高,有返回值(4.4以上系統(tǒng)使用)
 */
webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
        //此處為JS返回的結(jié)果
        Logger.d("value:" + value);
    }
});

完整源碼

Native調(diào)用JS示例源碼-NativeToJsBridgeActivity?

原文鏈接:https://blog.csdn.net/u012440207/article/details/121764843

欄目分類
最近更新