Android中使用WebView与JS交互全解析

  1.概述首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发。为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,Android和iOS两边都要维护同一套界面甚至是逻辑,这样开发和维护的成本会很大,而使用hybrid的开发方式的话,让前端的同学去写一套界面和逻辑,对于native端来说只要使用对应的容器去展示就可以了(对于Android来说这个容器当然就是WebView)。那为什么不所有的页面都使用这种方式开发呢?因为使用h5来展示界面的话用户体验始终是不如native的,所以在这两者之间我们需要一个权衡。
  
  介绍完了何为hybrid,我们来思考下面几个场景:场景1:前端那边的页面有一个按钮,点击这个按钮需要显示一个native的组件(比如一个toast),或者点击这个按钮需要去在native端执行一个耗时的任务。
  
  场景2:还是前端页面有一个按钮,点击这个按钮的逻辑是:如果登录了,则跳转到相应的界面,如果没有登录,则跳转到登录界面。而这个登录界面是我们native维护的。
  
  看完上面两个场景,相信大家也发现了一个问题,hybrid这样的开发方式有一个问题需要解决,那就是前端和本地的通信。
  
  下面将会给大家介绍active原生Android和h5之间的通信方式。
  
  2.如何使用使用WebView控件 与其他控件的使用方法相同 在layout中使用一个”WebView”标签不包括导航栏,地址栏等完整浏览器功能,只用于显示一个网页在WebView中加载Web页面,使用这里写图片描述注意在ma www.sratchina.com nifest文件中加入访问互联网的权限:11但是,在Android中点击一个链接,默认是调用手机上已经安装的浏览器程序来启动,因此想要通过WebView代为处理这个动作 ,那么需要通过这里写图片描述当然,我们也可以写一个类继承WebViewClient来对WebViewClient对象进行扩展这里写图片描述然后只需要将setWebViewClient的内容进行修改即可这里写图片描述另外出于用户习惯上的考虑 需要将WebView表现得更像一个浏览器,也就是需要可以回退历史记录,因此需要覆盖系统的回退键 goBack,goForward可向前向后浏览历史页面这里写图片描述例子1:WebViewClient的使用布局代码activity_main.xml:10.
  
  15.
  
  12345678910111213141516171234567891011121314151617代码:2.
  
  4.
  
  9.
  
  获取webview控件设置使用webview加载页面16.
  
  18.
  
  24.
  
  30.
  
  35.
  
  37.
  
  39.
  
  覆盖系统的回退键47.
  
  50.
  
  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152531234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253和java的相互调用用处非常大,通过可以使用Android原生的JavascriptInterface来进行js和Java的通信。
  
  例子2:JavaScript和java的相互调用首先我们写一段html代码:5.
  
  9.
  
  20.
  
  123456789101112131415161718192021www.boyuanyl.cn2223242512345678910111213141516171819202122232425这是一个很简单的HTML5页面,里面有一个button,点击这个button就执行js脚本中的showToast方法。
  
  这里写图片描述那么这个showToast方法做了什么呢?
  
  这里写图片描述可以看到control.showToast,这个是什么我们后面再说,下面看我们Android工程中的java代码。
  
  编写布局文件布局的内容很简单,就是嵌套一个WebView控件这里写图片描述编写MainActivity.java代码2.
  
  13.
  
  15.
  
  17.
  
  获取webview控件获取WebView的设置将JavaScript设置为可用,这一句话是必须的,不然所做一切都是徒劳的给webview添加JavaScript接口通过webview加载html页面32.
  
  42.
  
  46.
  
  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515212345678910111213141516171819202122232425262728www.gouyily.cn29303132333435363

www.boshenyl.cn

7383940414243444546474849505152上面的代码主要做了以下的步骤:a) 获取webview控件b) 获取webview的设置,将JavaScript设置为可用,打开JavaScript的通道这里写图片描述c) 在Android程序中建立接口 ,并编写相关逻辑再去看之前js脚本中的那个showToast()方法这里写图片描述这里的control就是我们的那个interface,调用了interface的show方法,很明显这里是js调用了Android的代码,输出了一个这里写图片描述可以看到这个interface我们给它取名叫control,最后通过loadUrl加载页面。
  
  这里写图片描述可以看到先显示一个toast,然后调用log()方法,log()方法里调用了js脚本的log()方法, js的log()方法做的事就是在控制台输出msg,这里明显是Android调用了js的方法。
  
  这里写图片描述d) 给webview添加我们自己编写的JavaScript接口通过WebView的addJavascriptInterface方法去注入一个我们自己写的interface。
  
  这里写图片描述e) 使用webview控件加载我们之前编写的html文件这里写图片描述在真实手机上运行程序,在控制台成功输出内容:这里写图片描述这样我们就完成了js和java的互调,是不是很简单。
  
  中处理JS的警告,对话框等在Android中处理JS的警告,对话框等需要对WebView设置WebChromeClient对象,并复写其中的onJsAlert,onJsConfirm,onJsPrompt方法可以处理javascript的常用对话框例子3:在Android中处理javascript的对话框1) 编写html页面布局分别测试javascript的三种对话框这是一个警告对话框!");更多信息请到我的博客去?"))
  
  你选择了不去!");演示一个带输入的对话框","这里输入你的信息");谢谢使用,你输入的是:下面我们演示3种对话框</p>警告、提醒对话框</p>提交带选择的对话框</p>提交要求用户输入的对话框</p>提交1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484912345678910111213141516171819202122232425262728293031323334353637383940414243444546474849页面效果:这里写图片描述中布局的编写请输入网址"/>连接" />123456789101112131415161718192021222324252627282930313212345678910111213141516171819202122232425262728293031323) 编写自定义对话框的布局新建prom_dialog.xml文件,在其中自定义一个带输入的对话框由TextView和EditText构成12345678910111213141516171819123456789101112131415161718194) 获取WebView控件,并进行相关的设置这里写图片描述5) 复写onKeyDown方法,当用户按返回键时,返回上一个加载的页面这里写图片描述6) 给WebView设置setWebChromeClient,并复写其中的方法设置3.
  
  处理javascript中的构建一个Builder来显示网页中的对话框提示对话框");14.
  
  点击确定按钮之后,继续执行网页中的操作25.
  
  30.
  
  36.
  
  38.
  
  40.
  
  处理javascript中的带选择的对话框");65.
  
  处理javascript中的为网页中对话框的提示内容在没有输入时,默认显示的内容自定义一个带输入的对话框由TextView和EditText构成77.
  
  设置TextView对应网页中的提示信息设置EditText对应网页中的输入框构建一个Builder来显示网页中的对话框设置弹出框标题带输入的对话框");设置弹出框的布局设置按键的监听93.
  
  97.
  
  点击确定之后,取得输入的值,传给网页处理104.
  
  106.
  
  109.
  
  117.
  
  126.
  
  设置网页加载的进度条133.
  
  139.
  
  142.
  
  取得编辑框中我们输入的内容判断输入的内容是不是网址装载网址

时间: 2024-10-20 09:24:06

Android中使用WebView与JS交互全解析的相关文章

Android中使用WebView, WebChromeClient和WebViewClient加载网页 (能够执行js)

Android中使用WebView, WebChromeClient和WebViewClient加载网页 在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持,下面是一个例子程序,先帖: 1 2 3 4 <?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

Android中脱离WebView使用WebSocket实现群聊和推送功能

WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考:如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? 今天的重点是讲如何在Android中脱离WebView使用WebSocket,而不是在Web浏览器使用,如果是在Web浏览器中使用,网上已经太多教程.框架和demo,没必要讲. 到目前为止我个人认为安卓端比较好用的WebS

Android中的webview的进度条

<application android:icon="@drawable/hunqin" android:label="@string/app_name" android:theme="@android:style/Theme.Light" > 主题 android:theme------->必须不能使Theme.Light.NoTitleBar 否则不起作用 requestWindowFeature(Window.FEATUR

网络模型中Inception的作用与结构全解析

网络模型中Inception的作用与结构全解析 一 论文下载 本文涉及到的网络模型的相关论文以及下载地址:   [v1] Going Deeper with Convolutions, 6.67% test error http://arxiv.org/abs/1409.4842 [v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test

Android 中利用WebViewJavascriptBridge 实现js和java的交互(一)

此文出自:http://blog.csdn.net/sk719887916/article/details/47189607 ,skay 博客 按安卓开发目前现状来说,开发者大部分时间还是花在UI的屏幕适配上,使用原生控件开发成本已不是那么理想,鉴于很多项目和ios基于一致的ui界面,至使安卓UI开发成本花费更大的代价,因此目前结合Html5和原生控件是解决UI适配的一种很好的选择,处于APP性能也会用java和native层进行结合.不管是哪种结合,其实原理都差不多,只要按照它的协议来,是很容

android webview与js交互(动态添加js)

1.本地html与本地html里的js交互 2.本地html与本地js交互 3.网络html与网络js交互 4.网络html与本地js交互 5.各个情况动态添加js 以上5点都可以用一种方式来模拟,在本篇中采用本地html与本地js交互 (包含动态添加js的操作) 6.拦截url请求(在webview加载完成以后,触发的请求url) 7.拦截url请求后返回自己封装的数据(基于第6点,加载完成后,触发一些请求数据的url时拦截并自己封装数据返回给webview) 注:6.7点将在下一篇博客介绍

Android开发之WebView与js的数据传递

在Android开发中不可避免的会出现,使用一个WebView来显示一个h5页面.如果仅仅只是显示h5页面,这不需要特殊的处理,但是很多情况下会出现,js和WebView的交互.比如:将html表单中的数据,传递到Activity中,在Activity中对数据校验,再上传到服务器. 那么js和WebView如何进行的交互的呢? 创建AndroidHtml项目.主要代码如下: MainActivity.java:     private WebView mWebView;     public s

WebView与Js交互

上周五,老大让暂时搞一个评分app,俩页面.第一个页面显示全部待评分的物业,第二个页面是相应物业的评分页面.评分页面是表格样式的,所以就让web端的同学写个html,我们通过Webview去展示. 这里不不过展示就完了,web页面须要知道我们点击的哪个物业以及所填评委的名字并显示在html上.所以client须要把这两个值传给html.当评委评分完后点击html里的提交button并提交成功后.client也须要进行响应.做法就是client提供接口,js代码去调用来获取值--JS调用Andro