当前位置: 首页 > ds >正文

Android 之 WebView与HTML交互

一、Android 原生代码(Java/Kotlin)

// MainActivity.java
public class MainActivity extends AppCompatActivity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webView);WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true); // 启用JS支持 [3,5](@ref)webSettings.setDomStorageEnabled(true); // 启用DOM存储// 注册JS接口(安全关键:限制暴露方法)webView.addJavascriptInterface(new JsBridge(this), "AndroidBridge"); // "AndroidBridge" 是JS中调用的对象名 [1,4](@ref)// 设置WebViewClient监听页面加载webView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);// 页面加载完成后调用JS函数callJavaScriptFunction("onNativeReady()");}});// 加载本地HTML(位于assets目录)webView.loadUrl("file:///android_asset/index.html");}// 原生调用JS方法(兼容Android 4.4+)private void callJavaScriptFunction(String jsCode) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {webView.evaluateJavascript(jsCode, null); // 高效无返回值调用 [6](@ref)} else {webView.loadUrl("javascript:" + jsCode); // 低版本兼容 [5](@ref)}}// 自定义JS桥接类(必须用@JavascriptInterface标记暴露的方法)public static class JsBridge {private Context context;public JsBridge(Context context) {this.context = context;}@JavascriptInterfacepublic void showToast(String message) {// 原生功能:显示ToastToast.makeText(context, message, Toast.LENGTH_SHORT).show();}@JavascriptInterfacepublic String getDeviceModel() {// 返回设备型号给JSreturn Build.MODEL;}}// 避免内存泄漏@Overrideprotected void onDestroy() {webView.destroy();super.onDestroy();}
}

二、HTML/JavaScript 代码(assets/index.html)

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>WebView交互示例</title><script>// 供原生调用的JS函数function onNativeReady() {document.getElementById("status").innerText = "页面加载完成!";}// JS调用原生方法(显示Toast)function callNativeToast() {AndroidBridge.showToast("Hello from JavaScript!"); // 通过AndroidBridge对象调用 [4](@ref)}// JS获取原生数据function getDeviceInfo() {const model = AndroidBridge.getDeviceModel();document.getElementById("deviceInfo").innerText = `设备型号: ${model}`;}</script>
</head>
<body><h1>WebView交互演示</h1><p id="status">加载中...</p><button onclick="callNativeToast()">调用原生Toast</button><button onclick="getDeviceInfo()">获取设备信息</button><p id="deviceInfo"></p>
</body>
</html>

所有暴露给 JS 的方法必须添加 @JavascriptInterface 注解,防止未授权访问

http://www.xdnf.cn/news/17052.html

相关文章:

  • 51单片机入门:矩阵键盘与简单密码锁项目
  • 10.Redis 数据类型
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)
  • 2561. 重排水果
  • 苏州银行招苏新基金研究部研究员
  • TCL --- 列表_part2
  • 【前端:Html】--1.1.基础语法
  • 大模型笔记1——李宏毅《2025机器学习》第一讲
  • python JSONPath 表达式生成器
  • 一维dp-序列类型-最长有效括号
  • 如何在`<link type=“icon“ href=`的`href`中写SVG并使用path标签? 笔记250802
  • Design Compiler:Milkyway库的创建与使用
  • 中之人模式下的虚拟主持人:动捕设备与面捕技术的协同驱动
  • 人工智能与交通:智能出行的变革与未来
  • retro-go 1.45 编译及显示中文
  • C/C++常用字符串函数
  • 具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?
  • Noob靶机
  • 大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?
  • 决策树算法:三大核心流程解析
  • 详解Python标准库之并发执行
  • 【王阳明代数讲义】基本名词解释
  • 机器学习消融实验:方法论演进、跨领域应用与前沿趋势
  • 海康皓视通 对接测试和比较
  • (吃饭)质数时间
  • AIDL当Parcelable序列化的数据类通信时报“Class not found when unmarshalling“找不到该类时的解决方案
  • JVM 01 运行区域
  • Python Pandas.from_dummies函数解析与实战教程
  • ubuntu双系统设置默认启动系统
  • Windows本地使用dify搭建知识库+ollama+deepseek