Android WebView使用
转自:http://www.cnblogs.com/oakpip/archive/2011/04/08/2009800.html
大部分内容为网上整理其它高人的帖子,现只作整理,用于查看:
在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。
什么是webkit
WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。
传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。
这里我们初步体验一下在android是使用webview浏览网页,在SDK的Dev Guide中有一个WebView的简单例子 。
在开发过程中应该注意几点:
1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。通过设webview.getSettings().setJavaScriptEnabled(true); 就可以打开JavaScript. webView.requestFocus()如果不设置的话,会出现不能弹出软键盘等问题。
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。
mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
4. postUrl(String url, byte[] postData) 加载页面使用Post方式,postData为参数
// post方式传送参数 String postData = "clientID=cid&username=name"; webview.postUrl(url, EncodingUtils.getBytes(postData, "base64"));
5.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }
6.事件侦听
WebChromeClient:
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
WebViewClient:
onLoadResource:加载资源时响应
onPageStart:在加载页面时响应
onPageFinish:在加载页面结束时响应
onReceiveError:在加载出错时响应
onReceivedHttpAuthRequest:
//此方法可以处理webview 在加载时和加载完成时一些操作 webView.setWebChromeClient(new WebChromeClient(){@Overridepublic void onProgressChanged(WebView view, int newProgress) {if(newProgress==100){ // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作title.setText("加载完成");}else{title.setText("加载中.......");}} });webView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) { //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边view.loadUrl(url);return true;}@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) {// 重写此方法可以让webview处理https请求handler.proceed(); } });
下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。
看一个实例:
public class WebViewDemo extends Activity {private WebView mWebView;private Handler mHandler = new Handler();public void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.webviewdemo);mWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = mWebView.getSettings();webSettings.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(new Object() {public void clickOnAndroid() {mHandler.post(new Runnable() {public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html");} }
打开自定义的html
String customHtml = "<html><body><h1>Hello, WebView</h1></body></html>"; webView.loadData(customHtml, "text/html", "UTF-8");
我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。
<html> <mce:script language="javascript"><!-- function wave() { document.getElementById("droid").src="android_waving.png"; } // --></mce:script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a> </body> </html>
这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点:
1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。
转载于:https://www.cnblogs.com/wangluochong/p/6015548.html
Android WebView使用相关推荐
- Android WebView访问SSL证书网页(onReceivedSslError)
Android WebView访问https SSL证书网页,如淘宝,需要在onReceivedSslError添加SSL支持 webview.setWebViewClient(new WebView ...
- android webview java_Android Webview中调用本地java方法
在网页调用本地的分享SDK class JsObject { @JavascriptInterface public String toString() { return "injected ...
- android的webView的教程,Android WebView 应用界面开发教程
WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用 ...
- Android WebView 支持H5图片上传input type=file
2019独角兽企业重金招聘Python工程师标准>>> Android WebView 缓存处理 Android WebView 支持H5图片上传<input type=&qu ...
- Chrome 调试 Android WebView 网页
手机开启开发者模式,并且Usb 连接到电脑 Android webView 开启调试模式 mWebView.setWebContentsDebuggingEnabled(true); Chrome 浏 ...
- Android webview 写入cookie的解决方法以及一些属性设置
Android webview 写入cookie的解决方法以及一些属性设置 参考文章: (1)Android webview 写入cookie的解决方法以及一些属性设置 (2)https://www. ...
- android url webview,android - webview获取到当前页面的url
android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回 a.com ...
- Android Webview H5 秒开方案实现
本文首发于微信公众号「玉刚说」 原文链接:Android Webview H5 秒开方案实现 前言 现在许多app都嵌入了H5页面, 然而WebView加载速度慢这个问题却一直影响着用户的体验, 所以 ...
- Android WebView 性能优化
原文出处:http://motalks.cn/2016/09/11/Android-WebView-JavaScript-3/ WebView相关阅读 Android WebView 和 javaSc ...
- Android WebView 和 javaScript的互相调用(三)
原文出处:http://motalks.cn/2016/08/27/Android-WebView-JavaScript-2/ WebView相关阅读 Android WebView 和 javaSc ...
最新文章
- linux内核启动时间优化
- 第一行代码学习笔记第九章——使用网络技术
- Spring Boot 集成 MyBatis 与 c3p0
- Intersection - POJ 1410(线段与矩形是否相交)
- oracle11g导出dmp文件 少表,Oracle11g导出dmp并导入Oracle10g的操作记录
- 工作153:position使用
- “约见”面试官系列之常见面试题第十八篇之深拷贝和浅拷贝得区别(建议收藏)
- 工作流实战_12_flowable 流程实例 终止流程
- Java函数编码_转[收集java的常用函数代码]
- php 新建 mysql用户_php为什么选mysql作为数据库? Mysql 创建用户方法
- 0. 跟踪标记 (Trace Flag) 简介
- SaaS架构设计之如何转化成SaaS多租户模式
- java.awt Robot 自动化测试 与 KeyEvent 常用按键
- Windows下创建TFTP服务器,uboot访问,下载镜像
- Python基本语法(快速入门)
- 怎么用计算机按log以2为底,log以2为底4的对数在计算器上怎么按?
- 免费全景摄影制作教程 - 摄影基础知识
- 自适应数字加密/收藏品NFT市场网站HTML5模版
- larval中sessions的使用
- CRLF和LF的区别
热门文章
- java集合对象声明_Java基础————集合类
- myeclipse 2019中文版
- PHP5 ini配置文件优化
- Python条件判断和循环,range()函数
- (十二)进一步掌握STVD/COSMIC
- 聊聊、Zookeeper 客户端 Curator
- jquery问题,如何调用带this的函数?
- 34.16.159(zz)
- BZOJ 1444: [Jsoi2009]有趣的游戏
- bzoj:1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏