Android和H5的交互
16lz
2021-12-04
Android和H5的交互
Android端的配置
初始化WebView
@SuppressLint("JavascriptInterface", "SetJavaScriptEnabled") private fun initWebView() { webView.clearCache(true) webView.clearHistory() webView.settings.javaScriptEnabled = true //允许使用js //为服务端提供调用客户端方法的对象,对象名称为android webView.addJavascriptInterface(this, "android") webView.webViewClient = webViewClient webView.webChromeClient = webChromeClient //不使用缓存,只从网络获取数据 webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE webView.settings.setSupportZoom(true) //不显示自带的缩放控件 webView.settings.displayZoomControls = false webView.settings.builtInZoomControls = true //支持屏幕缩放 loadURL(functionItem!!.item_url) }
/** * 加载网页 */ private fun loadURL(url: String) { if (Utility.isValidURL(url)) {//判断是否是有效的URL地址 emptyView.show(true) webView.loadUrl(url) } else { emptyView.show("URL地址错误", "") Logger.t(tag).i("不是有效的URL") } }
//帮助webView处理各种通知,请求事件 private val webViewClient: WebViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) Log.i(tag, "页面加载完成") emptyView.hide() } override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) Log.i(tag, "页面开始加载:$url") emptyView.show(true) } @RequiresApi(Build.VERSION_CODES.M) override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { Log.i(tag, "页面加载失败" + error!!.errorCode + error.description) super.onReceivedError(view, request, error) } override fun onReceivedHttpError(view: WebView?, request: WebResourceRequest?, errorResponse: WebResourceResponse?) { super.onReceivedHttpError(view, request, errorResponse) //处理HTTP返回的错误 Log.i(tag, "页面加载失败" + errorResponse!!.statusCode) } override fun onPageCommitVisible(view: WebView?, url: String?) { super.onPageCommitVisible(view, url) Log.i(tag, "页面已经显示") emptyView.hide() } }
//帮助webView处理与js的交互 private val webChromeClient: WebChromeClient = object : WebChromeClient() { override fun onReceivedTitle(view: WebView?, title: String?) { super.onReceivedTitle(view, title) Log.i(tag, "网页标题$title") setToolbarTitle(title!!) } override fun onProgressChanged(view: WebView?, newProgress: Int) { super.onProgressChanged(view, newProgress) Log.i(tag, "进度回调$newProgress") } }
供服务端调用的方法
@JavascriptInterface fun nextPage(str: String) { //JS调用Android的方法,这里的方法必须是public型的,否则会调用不到 runOnUiThread { Logger.t(tag).i("接收到跳转命令") if (!TextUtils.isEmpty(str)) { val cls = Class.forName("$packageName.module.view.function.handler.$str") val intent = Intent(WebPageActivity@ this, cls) Logger.t(tag).i("跳转页面:" + cls.canonicalName) startActivity(intent) } } }
服务端的配置
<button id="checkCode">查看示例程序button><script type="text/javascript"> document.getElementById("checkCode").onclick = function () { window.android.nextPage("HandlerActivity") }script>
更多相关文章
- android基础(对话框风格Activity实现)
- android基础(对话框风格Activity实现)
- Android页面启动 editext获取焦点 scrollView自动上滑问题
- PullToRefreshLayout +RecyclerView 实现上拉加载下拉刷新
- Android指定调用系统自带浏览器打开链接
- Android与JS互调
- Android(安卓)P系统时间更新分析
- 图片加载的几种模式
- ImageView下载图片加载