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

Android WebView 从入门到最佳实践

WebView 是什么?

WebView = 嵌在 App 内的浏览器
基于系统 Chromium 引擎,可渲染 HTML / CSS / JavaScript / 音视频。

适用业务:

  • H5 页面嵌入(活动页、产品介绍)

  • 混合开发(Hybrid)

  • 支付与登录授权页面

  • 文档/文章加载展示

WebView 整体架构

┌───────────────────────────┐
│          WebView          │ ← 容器(渲染网页)
├───────────────────────────┤
│   WebViewClient           │ ← 加载/navigation 控制(内开/外跳/拦截)
├───────────────────────────┤
│   WebChromeClient         │ ← UI & 权限(进度、标题、上传、全屏)
└───────────────────────────┘

WebView负责显示
WebViewClient负责怎么加载(路由/网络)
WebChromeClient负责展示浏览器 UI & 权限

WebSettings:浏览器能力开关

webView.settings.apply {javaScriptEnabled = true          // 必开(否则大多数 H5 白屏)domStorageEnabled = true          // 支持 localStorage / sessionStorageuseWideViewPort = true            // 页面自适应loadWithOverviewMode = truecacheMode = WebSettings.LOAD_DEFAULT
}
CookieManager.getInstance().setAcceptCookie(true)

常用开关:

功能设置
是否允许 JSjavaScriptEnabled
LocalStorage/IndexedDBdomStorageEnabled
混合内容(HTTPS + HTTP)mixedContentMode
自动播放视频mediaPlaybackRequiresUserGesture = false

WebViewClient:控制页面“怎么打开”

职责:网络/导航/资源/错误控制

能力方法
点击链接是否内开/外跳shouldOverrideUrlLoading
页面生命周期onPageStarted/onPageFinished
拦截资源请求shouldInterceptRequest
错误处理onReceivedError
SSL 证书错误onReceivedSslError

⚠️ 没设置 WebViewClient → 点击链接会跳系统浏览器

webView.webViewClient = object : WebViewClient() {override fun shouldOverrideUrlLoading(v: WebView, r: WebResourceRequest): Boolean {val url = r.url.toString()return if (url.startsWith("http")) falseelse { startActivity(Intent(Intent.ACTION_VIEW, r.url)); true }}
}

return false = WebView 内开
return true = 你处理(常见:跳外部 App,如微信/支付宝)

WebChromeClient:UI / 权限 / 上传

职责:浏览器 UI 和用户交互

功能方法
进度条onProgressChanged
网页标题onReceivedTitle
JS 的 alert/confirm/promptonJsAlert/onJsConfirm
上传图片 / 文件onShowFileChooser
相机/麦克风权限onPermissionRequest
视频全屏播放onShowCustomView

示例(显示进度条):

webView.webChromeClient = object : WebChromeClient() {override fun onProgressChanged(view: WebView, newProgress: Int) {progressBar.progress = newProgress}
}

文件上传、视频全屏、相机权限 都属于 WebChromeClient,不属于 WebViewClient。

JS ↔ Android 互调(JS Bridge)

✅ JS 调 Android(H5 调原生)

class JsBridge {@JavascriptInterfacefun toast(msg: String){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() }
}
webView.addJavascriptInterface(JsBridge(), "Android")

JS 调用Android:

Android.toast("Hello WebView") 


Android 调 JS :

webView.evaluateJavascript("javascript:showDialog()") {}

离线包 / 本地资源加载(关键能力)

安全加载本地 H5,不用 file://

val loader = WebViewAssetLoader.Builder().addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this)).build()override fun shouldInterceptRequest(v: WebView, r: WebResourceRequest) =loader.shouldInterceptRequest(r.url)

H5 访问:

https://appassets.androidplatform.net/assets/index.html

WebViewAssetLoader = 最安全的离线包方案(支持 HTTPS,同源策略不会报错)


Cookie / 登录 / SSO / 支付回跳

val cm = CookieManager.getInstance()
cm.setAcceptCookie(true)
cm.setAcceptThirdPartyCookies(webView, true)

若不设置第三方 Cookie → 支付/登录无法回跳

WebView 销毁防止内存泄漏(必须写)

override fun onDestroy() {(webView.parent as ViewGroup).removeView(webView)webView.stopLoading()webView.clearHistory()webView.removeAllViews()webView.destroy()super.onDestroy()
}

常见问题处理(实战)

问题原因解决方案
点击链接跳系统浏览器没设置 WebViewClient添加 shouldOverrideUrlLoading
上传图片没反应没设置 WebChromeClient用 onShowFileChooser
JS 调原生不生效未添加 @JavascriptInterface加注释
H5 页面白屏JavaScript 未开启javaScriptEnabled = true
微信/支付宝不能回跳Cookie 未开启第三方setAcceptThirdPartyCookies

最终总结

模块作用
WebSettings开关能力(JS、缓存、localStorage)
WebViewClient控制网络行为(内开/外跳、拦截资源、错误处理)
WebChromeClientUI 与权限(进度条、标题、上传、全屏视频)
JS BridgeJS 与原生互调
CookieManager登录状态维持
WebViewAssetLoader离线包

一句话记住:

WebViewControl = WebView + WebViewClient + WebChromeClient

下一篇:


WebView 最佳封装模板(BaseWebActivity + WebViewHelper)

http://www.dtcms.com/a/557433.html

相关文章:

  • 青岛公路建设集团有限公司网站好乐买网站推广方式
  • 自定义字段/动态字段的实现方法汇总
  • Python---数据容器(Dict 字典)
  • zabbix实现监控Hadoop、Docker、SSL证书过期时间应用的保姆级实操流程
  • 怎么在网站空间上传文件西地那非口崩片
  • Linux 容器安装 conda 和 pip
  • 中国建设银行企业门户网站wordpress theme 企业
  • k8s问答题(1)
  • 怎么用dw做带登陆的网站北京新网数码信息技术有限公司
  • MySQL 5.7 安装Audit 审计日志插件
  • 【Docker】P5 Docker Compose 实战指南:一键部署 WordPress + MySQL
  • 升鲜宝供应链管理系统-生鲜配送系统_分拣端界面重构设计(一)
  • 网站降权的原因discuz论坛网站做的门户
  • 【GitHub探索】代码开发AI辅助工具trae-agent
  • 绍兴做网站建设公司建设项目竣工验收公告网站
  • 量子计算机操作系统的破晓:中国“本源司南“与全球开源生态全景解析
  • 西安百度推广网站建设k8s wordpress mysqli
  • 计算机网络:Socket编程预备
  • 做网站地图邮什么好处现在的网站前端用什么做
  • 4399自己做游戏网站兰考县住房和城乡建设局网站
  • C++ Opencv 蓝图01(进阶版)
  • PyTorch2 Python深度学习 - 数据集与数据加载
  • 【开题答辩全过程】以 服装定制系统的设计与实现为例,包含答辩的问题和答案
  • 电商网站改版方案深圳建设银行网上银行登录
  • 做presentation的网站金融社区类网站建设
  • 绥中做网站青海西宁制作网站企业
  • 深入理解 Tailwind CSS 的宽高系统(Width Height)
  • ppt免费模板下载?【图文详解】12个ppt模板免费下载网站介绍?ppt模板制作?ppt模板下载?
  • 做网站的怎样找客户广告推广赚钱在哪接
  • 终端类型快速识别 + 核心命令对照速查表