Android培训
美国上市Android培训机构

400-111-8989

热门课程

Android WebView知识点总结

  • 时间:2017-05-18
  • 发布:Android培训
  • 来源:Android教程

Android WebView

github

项目中用到的webview的东西比较多,在这里总结一下。
权限
在AndroidManifest.xml中添加网络访问权限:
"android.permission.INTERNET"
设置WebView要显示的网页
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html");
函数
addJavascriptInterface:提供js可以调用的函数接口(addJavascriptInterface可能导致不安全,因为JS可能包含恶意代码)
setJavaScriptEnable:设置可以访问javaScript
setBuiltInZoomControls:设置可以缩放onKeyDown(intkeyCoder,KeyEventevent):处理back键

publicbooleanonKeyDown(intkeyCoder,KeyEventevent){
if(webView.canGoBack()&&keyCoder==KeyEvent.KEYCODE_BACK{
webview.goBack();//goBack()表示返回webView的上一页面
returntrue;
}
returnfalse;
}
加载网页的方式
loadUrl():webView.loadUrl("http://www.baidu.com");
loadData():webView.loadUrl("file:///android_asset/xx.html");
loadData(Stringdata,StringmimeType,Stringencoding):data为html代码内容

Stringsummary="<html><body>Youscored<b>192</b>points.</body</html>"
webview.loadData(summary,"text/html","UTF-8");
PS:最后一种有时候会显示为乱码,应该是编码的问题,可以把string的内容也变为utf-8的编码,统一编码格式,就不会乱码了,如下:

data=newString(data.getBytes(),"utf-8");
WebViewClient
onPageStarted:页面开始加载时
onPageFinished:页面加载结束时
onReceivedHttpAuthRequestonReceivedError:加载失败时,可以设置加载失败时reload
shouldOverrideUrlLoading:拦截url跳转,在里边添加点击链接跳转或者操作
onLoadResource:加载资源shouldInterceptRequest:拦截资源URl
使用场景
onPageStarted:当你想在页面加载开始的时候做一些事情,比如如果我要计算加载网页到底用了多久,会在start的时候记录一下开始时间
onPageFinished:同理,结束的时候记录一下结束时间。还可以在结束的时候打印网页的内容。另外一个就是,可以在finish之后对webview做resize。
onReceivedError:加载错误的时候,可以reload(),在请求加载一次,或者提示404的错误页面。
shouldOverrideUrlLoading:举一个例子,比如你的webview中加了文章外链,但是这个链接其实在本地客户端里边是有的,所以在网页的时候需要直接跳转到网页,在客户端打开的时候,要转成本地的。那么在客户端里就可以处理拦截一下url,如下:
Stringstr="http://www.xx.com/article/";
if(url.contains(str)){
String[]urls=url.split(str);
Stringid=urls[1];//然后根据id进行本地跳转...
}
shouldInterceptRequest:比如,如果你的app有离线下载的话,那么本来img标签里边的图片链接是http://xxx.png的,离线打开的时候应该是加载本地下载好的图片,那么,这个时候就要用到这个函数了,读取本地图片文件转换为InputStream传到WebResourceResponse作为返回值,需要拦截一下资源的链接,那我们举个简单的栗子:
@Override
publicWebResourceResponseshouldInterceptRequest(WebViewview,Stringurl){
if(!NetWorkCheckUtil.checkNet(context)&&url.contains(".png")){
String[]urls=url.split("/");
Stringimg=urls[urls.length-1];
url=Environment.getExternalStorageDirectory().getAbsolutePath()+"/images/"+img;
WebResourceResponseresponse=null;
try{
InputStreamlocalCopy=newFileInputStream(url);
if(url.contains(".png")){
response=newWebResourceResponse("image/png","UTF-8",localCopy);
}
}catch(IOExceptione){
e.printStackTrace();
}
if(response!=null)
returnresponse;
}
returnsuper.shouldInterceptRequest(view,url);
}
WebChromeClient
onJsAlert:处理alert弹出框,有时候需要webChromeClient处理弹出
onJsPrompt:处理prompt弹出框
onJsConfirm:处理confirm弹出框onProgressChanged:获取当前网页的加载进度
onReceivedIcon:获取网站的图标
onReceivedTitle:获取当前网页的title
onConsoleMessage:打印console信息
使用场景
onJsAlert:一般当需要显示alert的信息,把自带alert对话框变为无干扰的Toast提示。
@Override
publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,JsResultresult){
Log.i("MainActivity","onJsAlertmessage="+message);
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
result.confirm();
returntrue;
}
PS:这里容易出现的问题就是,如果你发现onJsAlert只会调用一次,那么你可能没有处理JsResult。需要调用result.confirm();或者result.cancel();,否则会出问题。-onProgressChanged:一般用作根据加载进度的变化来刷新进度条的进度。-onConsoleMessage:调试的时候如果想在console中看到打印信息,可以用这个函数。
@OverridepublicbooleanonConsoleMessage(ConsoleMessagecm){
Log.d("MyApplication",cm.message()+"--Fromline"+cm.lineNumber()+"of"+cm.sourceId());
returntrue;
}
onReceivedTitle:获取当前网页的title,比如,分享一个网页的时候,如果你需要获取到它的title,可以在这里边获取。如果在onProgressChanged中用getTitle()来获取会获取不到,因为网页没加载完。
与js相互调用
调用js:
mWebView.loadUrl("javascript:alert()");
js调用java:
window.js_callback.viewPicOnJavascript($('articleimg').index(this));
ps:格式就是window.类名.函数名,当然要给java的函数标注上@JavascriptInterface的注解才能让js调用的。
注释:4.2以后才有@JavascriptInterface,因为安全隐患问题。因为JavaScript可以通过反射访问注入webview的java对象的publicfields,使用宿主程序的权限执行java代码。所以,4.2以后,任何为JS暴露接口的,都要加上@JavascriptInterface。这样,这个Java对象的fields将不允许被js访问。
js的回调函数见上边
跳转到浏览器
如果不想在webview中显示网页,而是直接跳转到浏览器的话,可以像下边那样调用。
Uriuri=Uri.parse("http://www.example.com");
Intentintent=newIntent(Intent.ACTION_VIEW,uri);
startActivity(intent);
关于webview播放视频,退出后仍有声音问题
解决办法:
protectedvoidonPause(){
super.onPause();

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
webView.onPause();//暂停网页中正在播放的视频
}
}
收藏
上一篇:Android Studio导入项目非常慢的解决办法
下一篇:Android App 开发官方架构组件LifeCycle介绍

Android开发必备实用SDK推荐

Android开发源码剖析 便于性能分析的框架 hugo

Android 框架推荐小而美的日志框架 timber

Android 网络编程之WebView 的使用

选择城市和中心
贵州省

广西省

海南省