Android实现H5与Native交互的两种方式

发布时间 - 2026-01-10 22:00:01    点击率:

前言

大家都知道在Android WebView使用中,经常需要H5页面和Native页面进行交互,比如在网页上点击分享按钮,调用本地分享接口进行分享,分享成功后本地调用网页的JavaScript代码展示一条分享成功的消息。下面来看看一起看看两种实现方式是什么?

一、Url拦截的方式

重写ShouldOverrideUrl进行Url拦截,这种方式通过H5和Native协商好的Url格式来表明H5页面想要Native进行的操作,比如拨打电话,播放视频,查看某个用户的信息等操作,每种操作对应一种url格式,比如:

“/media/image/123”代表H5要调用Native查看id为123的图片;
“/webapp/close/webview”表示H5需要Native关闭当前页面;
“/webapp/patient_card/?patient_id=345”表示H5要调用Native显示用户345的详情页

可以通过url的parameter传递参数,并通过Uri.parse进行解析。返回true表示截断对该Url请求的响应。

protected WebViewClient mWebClient = new WebViewClient() {
 @Override 
 public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  // 添加tel链接响应
  if (url.startsWith("tel:")) { 
   Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
   startActivity(intent); 
   return true;
  }

  // 添加mp4播放相应
  if (url.endsWith(".mp4")) { 
   viewVideo(url); 
   return true;
  }

  // 添加图片链接响应
  if (Pattern.compile("/media/image").matcher(url).find()) { 
   viewImage(url); 
   return true;
  }
  // 关闭webview
  if (Pattern.compile("/webapp/close/webview").matcher(url).find()) {   
   onBackPressed(); 
   return true;
  }

  // 添加某个特殊url的响应
  if(Pattern.compile("/webapp/patient_card/").matcher(url).find()) { 
   Uri uri = Uri.parse(url); 
   String patientId = uri.getQueryParameter("patient_id");
   viewPatientInfo(patientId);

   return true;
  }

  return super.shouldOverrideUrlLoading(view, url);   
};

二、JavaScript注入方式

相比于Url拦截的方式,JavaScript注入的方式更加直接,Native将开放给H5调用的函数注入JavaScript,H5通过JavaScript调用Native函数完成操作。

1、获取webView的WebViewSettings设置,调用setJavaScriptEnabled开启JavaScript调用。

WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);

2、将需要暴露给JavaScript的函数前面添加@JavascriptInterface注解,只有添加了该注解的函数才能被JavaScript调用。

public class WebAppInterface {
 @JavascriptInterface
 public boolean method1(String param1, String param2) {
   // do something
 }

 @JavascriptInterface
 public boolean method2(String param1, String param2) {
   // do something
 }
}

3、通过WebView的addJavascriptInterface方法,将Native方法所在的class注入到JavaScript中。该函数的第一个参数是注入的Native对象,第二个参数是该对象的名字,JavaScript通过改名字访问该对象

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(), "InterfaceName");

4、这样,H5页面就可以通过下面的JavaScript调用Native的函数了

<script type="text/javascript"> 
 function method1(param1, param2) {  
  InterfaceName.method1(param1, param2); 
 }
</script>

Native调用JavaScript

Native调用JavaScript函数的方法比较简单,通过loadUrl函数进行:

// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");

// 有参数调用
mWebView.loadUrl("javascript:test('" + param+ "')"); // param是js的函数test()的参数

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流。


# h5  # native  # 交互  # android  # h5和native交互  # Android的WebView与H5前端JS代码交互的实例代码  # Android webview加载H5方法详细介绍  # Android Studio打包H5网址页面  # 封装成APK  # 移动端H5唤起APP的写法实例(IOS、android)  # Android与H5交互产生Script Error踩坑解决  # 第一个  # 大家都  # 两种  # 可以通过  # 第二个  # 来看看  # 重写  # 这篇文章  # 如在  # 就可以  # 拨打电话  # 详情页  # 改名字  # 有疑问  # close  # webview  # parameter  # webapp  # patient_id  # Uri 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel如何处理表单验证?(Requests代码示例)  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何制作一个表白网站视频,关于勇敢表白的小标题?  昵图网官网入口 昵图网素材平台官方入口  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何实现事件和监听器?(Event & Listener实战)  如何在 React 中条件性地遍历数组并渲染元素  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何挑选优质建站一级代理提升网站排名?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  用yum安装MySQLdb模块的步骤方法  郑州企业网站制作公司,郑州招聘网站有哪些?  Python自动化办公教程_ExcelWordPDF批量处理案例  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  如何在香港免费服务器上快速搭建网站?  三星、SK海力士获美批准:可向中国出口芯片制造设备  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在建站宝盒中设置产品搜索功能?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何在IIS中新建站点并配置端口与IP地址?  html如何与html链接_实现多个HTML页面互相链接【互相】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何在万网自助建站中设置域名及备案?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何在IIS7上新建站点并设置安全权限?  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  android nfc常用标签读取总结  详解vue.js组件化开发实践