Android WebView开发之WebView与Native交互

 更新时间:2021年12月16日 14:28:22   作者:红日666  
随着H5的广泛使用,Android开发过程中免不了会使用网页来做展示,那么web与native之间的通信就显得尤其重要了,其实际上是JavaScript与java之间的通信。本文将为大家详细介绍二者是如何实现交互的,需要的朋友可以参考一下

前言

附GitHub源码:WebViewExplore

一、JS调用Native的三种方式

1、通过WebView的addJavascriptInterface进行对象映射

需要注意的是这种调用方式,如果你的 minSdkVersion <=16那么需要考虑到4.2之前的漏洞问题。

mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
    /**
     * JS调用android原生方法1:
     *
     * 通过WebView的addJavascriptInterface()进行对象映射
     */
    private class JsCallAndroidInterface {
 
        /**
         *@JavascriptInterface注解方法.
         * js端调用,4.2以后安全;4.2以前,当JS拿到Android这个对象后,
         * 就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类)
         * 从而进行任意代码执行。
         * @param msg
         */
        @JavascriptInterface
        public void callback(String msg) {
            ToastUtil.showToast(APIWebViewActivity.this, "JS方法回调到web了 :" + msg);
        }
    }

2、通过WebViewClient shouldOverrideUrlLoading方法回调拦截url:

与url重定向类似,可在此做url的拦截,已达到针对性的调用native方法的目的。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (resolveShouldLoadLogic(url)) {
        return true;
    }
    return super.shouldOverrideUrlLoading(view, url);
}
    /**
     * JS调用android原生方法2:
     *
     * 通过WebViewClient shouldOverrideUrlLoading方法回调拦截url
     *
     * 根据协议的参数,判断是否是所需要的url:
     * 一般根据scheme(协议格式),authority(协议名)来判读
     *
     * @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、通过WebChromeClient的 onJsPrompt()等方法 ,回调拦截JS对话框prompt()等:

        /**
         * 是否支持页面中的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调用android原生方法3:
     *
     * 通过WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法
     * 回调拦截JS对话框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调用Native示例源码-JsToNativeBridgeActivity

二、Native调用WebView的两种方案

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

此方法简洁、效率低。当不需要返回值且对性能要求较低时可以考虑使用:

/**
* Native调用JS方法一:
* 方法简洁、效率低
* 当不需要获取返回值且对性能要求较低时可选择使用。
*/
webView.loadUrl("javascript:callJS()");

2、evaluateJavascript(script,resultCallback):

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

/**
 * Native调用JS方法二:
 * 效率高,有返回值(4.4以上系统使用)
 */
webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
        //此处为JS返回的结果
        Logger.d("value:" + value);
    }
});

完整源码

Native调用JS示例源码-NativeToJsBridgeActivity 

到此这篇关于Android WebView开发之WebView与Native交互的文章就介绍到这了,更多相关Android WebView与Native交互内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android 中的 XRecyclerview的使用案例

    Android 中的 XRecyclerview的使用案例

    这篇文章主要介绍了Android 中的 XRecyclerview的使用案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Android实现记事本功能

    Android实现记事本功能

    这篇文章主要为大家详细介绍了Android实现记事本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Flutter质感设计之模态底部面板

    Flutter质感设计之模态底部面板

    这篇文章主要为大家详细介绍了Flutter质感设计之模态底部面板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】

    Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】

    这篇文章主要介绍了Android开发教程之Fragment定义、创建与使用方法,详细介绍了Fragment的概念、功能、定义、创建及使用方法,包括Fragment与Activity通讯,Fragment事务执行及Fragment应用示例等,需要的朋友可以参考下
    2017-11-11
  • Android计步功能的实现代码

    Android计步功能的实现代码

    本篇文章主要介绍了Android计步功能的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Kotlin startActivity跳转Activity实现流程详解

    Kotlin startActivity跳转Activity实现流程详解

    在Android当中,Activity的跳转有两种方法,第一个是利用startActivity(Intent intent);的方法,第二个则是利用startActivityForResult(Intent intent,int requestCode);的方法,从字面上来看,这两者之间的差别只在于是否有返回值的区别,实际上也确实只有这两种区别
    2022-12-12
  • Android4.0平板开发之隐藏底部任务栏的方法

    Android4.0平板开发之隐藏底部任务栏的方法

    这篇文章主要介绍了Android4.0平板开发之隐藏底部任务栏的方法,结合实例形式较为详细的分析了Android隐藏于显示底部任务栏的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android数据库增删改查实战案例

    Android数据库增删改查实战案例

    我们在编程中经常会遇到数据库的操作,这篇文章主要给大家介绍了关于Android数据库增删改查的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Dagger2 Android依赖注入学习笔记

    Dagger2 Android依赖注入学习笔记

    这篇文章主要介绍了Dagger2 Android依赖注入学习笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Android调用手机摄像头的方法

    Android调用手机摄像头的方法

    这篇文章主要为大家详细介绍了Android调用手机摄像头的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论