JavaScript调用Android接口常见的3种方式

 更新时间:2025年05月28日 10:27:58   作者:遥不可及zzz  
这篇文章主要介绍了JavaScript调用Android接口常见的3种方式,分别是通过addJavascriptInterface注入Java对象、拦截WebChromeClient实现双向通信、拦截URLScheme支持单向调用,需要的朋友可以参考下

前言

在 Android 开发中,JavaScript(JS)调用原生 Android 接口主要通过 WebView 组件实现。以下是常见的 3 种核心方式及具体实现逻辑:

1. addJavascriptInterface 注入接口​​

​原理​​:通过 WebView 向 JS 暴露一个 Java 对象,JS 可直接调用该对象中被 @JavascriptInterface 注解标记的方法

​步骤​​:

  • ​定义接口类​​:
    public class WebAppInterface {
        Context mContext;
        WebAppInterface(Context c) { mContext = c; }
    
        @JavascriptInterface
        public void showToast(String msg) {
            Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
        }
    }
  • ​注入接口到 WebView​​:
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new WebAppInterface(this), "AndroidBridge");
  • ​JS 调用​​:
    window.AndroidBridge.showToast("Hello from JS!");

​注意事项​​:

  • ​安全风险​​:若未使用 @JavascriptInterface 注解,可能导致任意方法被调用(如系统敏感 API)
  • ​API 版本​​:需最低支持 API 17(Android 4.2)

​​2. 拦截 WebChromeClient 对话框​​

​原理​​:通过重写 WebChromeClient 的对话框回调方法(如 onJsPrompt),解析 JS 发送的指令

​步骤​​:

  • ​自定义 WebChromeClient​​:
    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            if (message.startsWith("native:")) { // 协议约定
                handleNativeCall(message); // 解析并执行原生逻辑
                result.confirm("success"); // 返回结果给 JS
                return true;
            }
            return super.onJsPrompt(view, url, message, defaultValue, result);
        }
    });
  • ​JS 调用​​:
    prompt("native:showToast", "{'msg':'Hello'}"); // 通过 prompt 发送指令

​适用场景​​:

  • 需要双向通信(JS 可获取原生返回值);
  • 兼容低版本 Android(无需依赖 @JavascriptInterface

​​3. 拦截 URL Scheme​​

​原理​​:JS 触发特定格式的 URL 请求(如 myapp://action?params),Android 通过 shouldOverrideUrlLoading 拦截并处理

​步骤​​:

  • ​自定义 WebViewClient​​:
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("myapp://")) { // 协议约定
                parseUrl(url); // 解析 URL 并执行对应逻辑
                return true; // 阻止默认加载
            }
            return super.shouldOverrideUrlLoading(view, url);
        }
    });
  • ​JS 调用​​:
    window.location.href = "myapp://showToast?msg=Hello"; // 或通过 iframe 触发

​优缺点​​:

  • ​优点​​:兼容性最好(支持所有 Android 版本);
  • ​缺点​​:仅支持单向调用(JS 无法直接获取原生返回值)

​​安全建议​​

  • ​输入校验​​:对 JS 传递的参数进行严格校验,防止注入攻击
  • ​最小权限原则​​:仅暴露必要的接口方法,避免敏感操作(如文件读写)
  • ​HTTPS 加密​​:加载远程页面时使用 HTTPS,避免中间人攻击

总结 

到此这篇关于JavaScript调用Android接口常见的3种方式的文章就介绍到这了,更多相关JS调用Android接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android实现透明动画

    Android实现透明动画

    这篇文章主要为大家详细介绍了Android实现透明动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • android之RatingBar控件用法详解

    android之RatingBar控件用法详解

    下面小编就为大家带来一篇android之RatingBar控件用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Android系列---JSON数据解析的实例

    Android系列---JSON数据解析的实例

    JSON(JavaScript Object Notation)和XML,并称为客户端和服务端交互解决方案的倚天剑和屠龙刀,这篇文章主要介绍了Android系列---JSON数据解析的实例,有兴趣的可以了解一下。
    2016-11-11
  • Android 多渠道打包进阶版

    Android 多渠道打包进阶版

    上篇文章更了Android 多渠道打包,这篇文章将做一个后续继续更Android 多渠道打包进阶版,上次意未尽的朋友可以继续啦,第一次点进来的朋友也可以看上次文章
    2021-09-09
  • Flutter启动流程的深入解析

    Flutter启动流程的深入解析

    这篇文章主要给大家介绍了关于Flutter启动流程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 详解Flutter如何获取Text截断后的字符串

    详解Flutter如何获取Text截断后的字符串

    当Text文本设置maxLins属性将文本强制截断之后,Text的承载字符串是截断前,还是截断后的呢,我们又该如何获取截断后的字符串呢,下面就来和大家详细讲讲
    2023-06-06
  • Android切换卡TabWidget用法示例

    Android切换卡TabWidget用法示例

    这篇文章主要介绍了Android切换卡TabWidget用法,结合实例形式分析了TabWidget选项卡界面布局及功能实现的操作技巧,需要的朋友可以参考下
    2016-08-08
  • Android判断当前应用程序处于前台还是后台的两种方法

    Android判断当前应用程序处于前台还是后台的两种方法

    这篇文章主要介绍了Android判断当前应用程序处于前台还是后台的两种方法,有需要的朋友可以参考一下
    2013-12-12
  • Android自定义Animation实现View摇摆效果

    Android自定义Animation实现View摇摆效果

    这篇文章主要为大家详细介绍了Android自定义Animation实现View摇摆效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 解决Android MediaRecorder录制视频过短问题

    解决Android MediaRecorder录制视频过短问题

    本文主要介绍Android MediaRecorder,在使用MediaRecorder时经常会遇到视频录制太短问题,这里提供解决问题的实例代码以供大家参考
    2016-07-07

最新评论