- 浏览: 173554 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hety163:
socket并不一定是长连接吧。。。
【转】关于socket长连接的心跳包 -
u013490012:
楼主,这个加阴影不是很清楚.我按照文章介绍的,程序出错啊
Android自定义Shape 加上阴影shadow之方法 -
cz2861856:
很好的文章!
Android自定义Shape 加上阴影shadow之方法 -
ezfantasy:
好文,转走了
Android 使用xliff 格式化字符串 -
songfantasy:
ericbaner 写道Android官方blog:http: ...
Android HTTP Clients使用选择介绍
本文主要对WebView进行介绍,包括webView 4个可以定制的点、设置WebView back键响应、控制网页的链接仍在webView中跳转、显示页面加载进度、处理https请求、利用addJavascriptInterface实现android程序和javascript交互等等
WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问
Xml代码 [url=][/url]
<uses-permission
android:name="android.permission.INTERNET"
/>
WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
WebView有几个可以定制的点:
(1)设置WebChromeClient子类,WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等,详见WebChromeClient
(2)设置WebViewClient子类,WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见WebViewClient
(3)设置WebSettings类,其中包含多项配置。WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见WebSettings
(4)设置addJavascriptInterface方法,将java对象绑定到webView中,以方便从页面js中控制java对象,实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webView的代码都是自己完成,详细使用addJavascriptInterface进行自动化见本文5使用addJavascriptInterface完成和js交互
1、back键控制网页后退
Activity默认的back键处理为结束当前Activity,webView查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onKeyDown函数,告诉他如何处理,如下:
Java代码 [url=][/url]
public
boolean onKeyDown(int keyCode, KeyEvent event) {
if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
webView.goBack();
return
true;
}
return
super.onKeyDown(keyCode, event);
}
其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true
webView.goBack();表示返回webView的上次访问页面
2、当前网页的链接仍在webView中跳转
Java代码 [url=][/url]
webView.setWebViewClient(new WebViewClient() {
@Override
public
boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return
true;
}
});
shouldOverrideUrlLoading表示当前webView中的一个新url需要加载时,给当前应用程序一个处理机会,如果没有重写此函数,webView请求ActivityManage选择合适的方式处理请求,就像弹出uc和互联网让用户选择浏览器一样。重写后return true表示让当前程序处理,return false表示让当前webView处理
Xml代码 [url=][/url]
Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url.
参考:
http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
3、页面加载进度
代码如下
Java代码 [url=][/url]
webView.setWebChromeClient(new WebChromeClient() {
public
void onProgressChanged(WebView view, int progress) {
setTitle("页面加载中,请稍候..." + progress + "%");
setProgress(progress * 100);
if (progress == 100) {
setTitle(R.string.app_name);
}
}
});
onProgressChanged通知应用程序当前页面加载的进度
progress
表示当前页面加载的进度,为1至100的整数
参考:
http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)
4、处理https请求
webView默认是不处理https请求的,页面显示空白,需要进行如下设置:
Java代码 [url=][/url]
webView.setWebViewClient(new WebViewClient() {
@Override
public
void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
// handler.cancel();
// handler.handleMessage(null);
}
});
onReceivedSslError为webView处理ssl证书设置
其中handler.proceed();表示等待证书响应
handler.cancel();表示挂起连接,为默认方式
handler.handleMessage(null);可做其他处理
参考:
http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError)
5、使用addJavascriptInterface完成和js交互
5.1 javascript中调用java对象及方法
设置webView的addJavascriptInterface方法,该方法有两个参数,第一个参数为被绑定到js中的类实例,第二个参数为在js中暴露的类别名,在js中引用java对象就是用这个名字
Java代码 [url=][/url]
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");
实现绑定到js的类,其中的javaMethod方法我们将在页面前端js中调用,用于返回一段内容。showHtml用来使用AlertDialog显示一段html代码,稍后将使用到
Java代码 [url=][/url]
private
class ClassBeBindedToJS{
public
void showHtml(String html){
new AlertDialog.Builder(UpdateStatusActivity.this)
.setTitle("HTML").setMessage(html)
.setPositiveButton(android.R.string.ok, null)
.setCancelable(false).create().show();
}
public String javaMethod() {
return
"use java method";
}
};
如此我们就可以在前端调用java对象,如下:
Html代码 [url=][/url]
<span><html>
<body>
<div
id="displayDiv">Test page.</div>
<input
type="button"
value="use java object"
onclick="document.getElementById('</span>displayDiv').innerHTML=classNameBeExposedInJs.javaMethod()"
/>
<span>
</body>
</html></span>
这段html作用为点击button按钮,改变div内容为java对象方法中的内容,其中classNameBeExposedInJs为java对象在js中的别名,javaMethod为java对象的方法
5.2 java中调用js方法
用webView的loadUrl实现,比如现在我们想在页面加载完成后调用js中的hello函数,实现如下:
Java代码 [url=][/url]
webView.setWebViewClient(new WebViewClient() {
@Override
public
void onPageFinished(WebView webView, String url){
webView.loadUrl("javascript:hello()");
}
});
怎么样,很简单吧^_^,直接loadUrl("javascript:hello()")就可以了
利用这一点我们可以很方便的实现WebView的自动化,如网页自动化登录。举个栗子,实现http://m.renren.com/ 的自动登录啊,代码如下
Java代码 [url=][/url]
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://m.renren.com");
webView.requestFocus();
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");
webView.setWebViewClient(new WebViewClient() {
@Override
public
void onPageFinished(WebView webView, String url){
webView.loadUrl("javascript:document.getElementsByName('email')[0].value='userName'");
webView.loadUrl("javascript:document.getElementsByName('password')[0].value='userPassword'");
webView.loadUrl("javascript:document.getElementsByName('login')[0].click()");
}
});
从中可以看出先加载http://m.renren.com页面,在页面加载完成onPageFinished后,调用js实现自动登录
其中三句js分别表示设置用户名文本框内容、设置用户密码文本框内容、点击登录按钮,如此登录成功喽
5.3 java和js混用实现一些效果
5.3.1 WebView用AlertDialog显示页面的html代码
之前5.1中的showHtml方法现在派上用场啦,在页面加载完成后显示页面html内容,如下:
Java代码 [url=][/url]
webView.setWebViewClient(new WebViewClient() {
@Override
public
void onPageFinished(WebView webView, String url){
webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(document.getElementsByTagName('html')[0].innerHTML);");
}
});
其中webView.loadUrl表示调用页面中的js,而页面中的js window.classNameBeExposedInJs.showHtml调用了程序中的java对象的方法,方法参数为一段js。
首先webView会执行这一段js document.getElementsByTagName('html')[0].innerHTML。含义即为取得页面中html标记的innerHTML,及网页主要内容;
然后将得到的网页内容当作字符串参数传入showHtml方法
最后调用showHtml函数实现,即用AlertDialog显示字符串,如此得到了整个网页的大部分html代码
5.3.2 WebView显示当前页面的url地址
获得WebView当前页面url使用webView.getUrl()即可,如下:
Java代码 [url=][/url]
webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml('" + webView.getUrl() + "');");
发表评论
-
【转】eclipse 找不到Courier New 样式解决方法
2013-07-13 17:24 1001之前有朋友问到说eclipse3.7,以及以后版本(貌似直 ... -
【转】Android使用ant对项目进行编译签名优化打包
2013-05-14 10:42 1034Android本身是支持ant打包项目的,并且SDK中自带一个 ... -
Android一些常用的颜色值
2013-05-09 17:30 1077一些常用的颜色值: <?xml version= ... -
【转】Android jar resource 资源文件的获取
2013-04-17 23:56 4431jar引用的资源文件必须放在assets文件夹中,并且布局文 ... -
【转】Android导出jar library时资源resource id获取的问题
2013-04-17 23:50 4200当需要把一个Android导出为jar包时,如果里面有用 ... -
【转】Android类库打包方法探究
2013-04-17 10:51 831开发Android应用的时候 ... -
【转】Android编程之解决android-support-v4打包问题
2013-03-11 19:21 1067如果工程引入了android-s ... -
【转】Android NIO Socket编程
2013-03-05 20:45 1625根据前两周写的关于Socket编程的网络通信的代码,现在对有 ... -
【转】关于socket长连接的心跳包
2013-03-05 17:39 2260出于最近对im研究的兴趣,看到smack里有个30s发送一个 ... -
【转】java nio对OP_WRITE的处理解决网速慢的连接
2013-03-05 15:20 201217.3.1 如何处理慢速的 ... -
【转】Java 加密解密基础
2013-01-24 10:54 997Java 加密解密基础 密码学是研究编制密码和破译密码的 ... -
【转】RSA选用小公钥指数(e=3)真的不安全吗?
2013-01-24 10:04 2880引言现有的大部分RSA算法实现都遵循PKCS#1 v2.1/ ... -
【转】RSA加密的填充模式
2013-01-24 10:02 4935跟DES,AES一样, RSA也是一个块加密算法( bloc ... -
【转载】RSA数字签名与加密、解密间的关系
2013-01-22 22:02 1181转载提及RSA,大家 ... -
ubuntu 10.04LTS安装sun java6 jdk问题解决
2013-01-07 18:01 1210unbuntu10.04安装java6问题 Packag ... -
异步线程干活和回调 的设计模式
2012-12-04 12:24 0老板要干事情通过开启代理线程进行,老板有一个回调函数代理(苦力 ... -
如何成为JAVA大牛?
2012-12-04 11:19 0如何成为JAVA大牛? 首先要有目标的去学习,我给 ... -
经典JAVA面试题
2012-11-29 10:26 0基础: 1. JAVA的数据类型可以分成哪两类? 原始 ... -
接口与抽象类
2012-11-27 23:22 1030以下为选摘自网络,罗 ... -
android 使用Application保存全局变量
2012-10-29 17:37 1705三个步骤,将全局对象保存在Application进程。 ...
相关推荐
Android WebView 去除标题 利用javacript交互
Android Webview 滑动监听 放大缩小查看网页图片
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...
Android下使用Webview实现的HTML5视频播放器,播放本地视频时请加载video目录下的1.html
Android WebView实现自由复制文字
android webview input=file 失效解决方案
Android webview 加载网页以及本地资源以及SD资源demo,以及加载缓存资源
android webview模拟网页post操作
Android实现WebView懒加载,提前进行页面JS资源加载。减少WebView加载时间及加载资源问题。Android 8.0以前需要引入X5内核,Android 8.0以后无特殊要求。
android WebView上传文件
Android WebView播放视频开发中总结的一些经验,希望同大家分享,这个是相应的Demo,一些经验和注释都在代码中写到。
android webview拨打电话 关注博客http://himici.com
这是AOSP的webview,包名com.android.webview,不是google的webview
Android webview 播放视频、文字复制
现在web app越来越多,webview控件的使用也越来越重要。 有时我们会在启动页或引导页之后,加载一个webview为控件的主页。 但如果跳转之后再加载,会看到webview有一个加载的过程,如果网页较大可能加载起来会很慢。...
Android使用WebView获取网页的源码,将WebView封装进ArthurWebView,直接创建并初始化即可使用!
Android webview加载网页