WebView用于展示网页,这个类可以使你在activity中滚动网页和简单地显示网页内容。
类结构如下:
1.1 在AndroidManifest添加网络权限:
1.2 如果你的需求实现想展示网页,不涉及到和应用的交互,可以直接使用手机本身带有浏览器服务的应用,如自带浏览器,第三方应用(UC、QQ等):
Uri uri = Uri.parse("http://www.example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
1.3 加载网页:
1.3.1 加载url
webview.loadUrl("http://www.example.com");
添加请求头:
Map<String ,String> request = new HashMap();
request.put("agent", "android");
mWebView.loadUrl(loadUrl, request);
1.3.2 直接加载html标签内容
你也可以通过html string 来加载网页,如:
String htmlStr= "<html><body>You scored <b>185b> points.body>html>";
webview.loadData(htmlStr , "text/html", null);
1.3.3 加载本地资源
webview.loadUrl("file:///android_asset/example.html");
2.1 WebChromeClient和WebViewClient接口
WebChromeClient用于辅助js的对话框,加载进度等;
WebViewClient则用于辅助各种通知、请求事件等。
2.2 Cookie
CookieSyncManager和CookieManager可以实现webview在请求是保住cookie请求状态,如下:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie(ROOT_URL, onGetCookie());
CookieSyncManager.getInstance().sync();
2.3 javascript交互
当需要和网页内容进行交互时,即和javascript进行交互,方法如下:
1) 设置支持javascript
setJavaScriptEnabled(true);
2) 添加回调的入口
addJavascriptInterface(this, “test”);
3) 交互
App端:可通过webview调用loadUrl(“javascript:method(param)”)方法来实现加载web端的方法;
web端:加载通过addJavascriptInterface添加进来的对象的方法,为了调用的安全,需要在被调用的方法前面加
@JavascriptInterface声明。
(参数返回:4.4之前,通过java和js端互调来实现参数的返回,
后来就提供了相应的接口来实现这需求:
webView.evaluateJavascript("testParam(0,1)", new ValueCallback() {
@Override
public void onReceiveValue(String arg0) {
//result callback
}
});)
2.4 get、post请求
get: 直接使用loadUrl方法
post:使用postUrl方法,
String postDate = "userName=abc&date=20160928";
webview.postUrl("www.xingyu.com",EncodingUtils.getBytes(postDate, "BASE64"));
2.5 https请求
Webview也可以支持https的请求,即实现WebViewClient的onReceivedSslError方法,实现如下:
webview.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView arg0, SslErrorHandler arg1, SslError arg2) {
arg1.proceed();//接收证书
}
});
2.6 网页往回
在实际网页交互的过程中,当用户按下返回键时,往往是想返回到页面的上一级,而不是直接关闭网页,这样就需要对返回事件进行拦截和处理,理由webview的返回栈进行页面的返回操作,代码如下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
if(webview.canGoBack()) {
webview.goBack();
return true;
} else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}
2.7 webview缓存
Dom Storage:存储键值对key/value,5M大小,较大缓存,存储简单:
webSettings.setDomStorageEnabled(true);
Indexed Database:数据库存储,存储空间更大
webSettings.setJavaScriptEnabled(true);
缓存控制:(配合相应的标志位使用)
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
清除缓存:
webview.clearCache(true);
webview.clearHistory();
2.8 资源预加载
首次加载过程中,可以预先加载图片等资源来优化页面的加载效率,可以通过接口来实现该需求:
webview.setWebViewClient(new WebViewClient(){
@Override
public WebResourceResponse shouldInterceptRequest(WebView arg0,String arg1) {
WebResourceResponse wrr = null;
//getResourcePreLoading
//……
return wrr;
}
});
2.9 屏幕自适应
webview可以实现加载的页面进行屏幕的适配:
getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
getSettings().setLoadWithOverviewMode(true);
3.1 内存泄漏
之前在开发过程中,常碰到的一个问题就是当页面加载内容大的时候,容易遇到内存泄漏的问题,
解决该问题的常用方法有两个:
1)弱化activity和webview的关联,即可以直接在运行的时候讲webview添加到布局中来,
并且出入的context为application:
rootView.addView(new WebView(getApplicationContext()), 0);
(此做法在webview 中网页带有的flash弹出dialog可能会失效)
2)独立进程中运行webview。另开个进程来加载webview,并通过AIDL和主进程进行通信,用完后就直接销毁进程,这样就
算是内存泄漏了也不影响到主进程,当然这种方式设计到进程通信,相比第一种会麻烦些。
3.2 getSettings().setBuiltInZoomControls(true)
用户在使用该方法进行缩放控制,当触摸到屏幕时,会出现控制的图标,该图标一会后会自动消失。但在这过程中退出
activity的话,一些系统版本会出现奔溃问题,原因是该图标找不多了所依附的window而出现奔溃问题,解决该问题的
最简单的做法是在activity的ondestroy方法中隐藏webview,即 webview.setVisibility(View.GONE);
3.3 webview页面播放音频,退出后扔播放:
可以直接调用destroy()方法来关闭音频,即webView.destroy();
在应用开发的过程中,安卓端比较麻烦的意见事情就是机型适配,在使用原生的webview的时候由于厂商对系统做了处理,所以各个机型对于不同的网页也产生不一样的渲染效果。为了弥补这个问题,可以考虑统一使用相同的浏览器内核,这样就就比较大地避免了webview在使用过程中的适配问题,这里推荐使用由腾讯开发的x5浏览器内核。
相比于普通的手机自带浏览器内核,它有这样的优点:
1) 速度快:相比系统webView的网页加载速度有近30%的提升。
2) 省流量:云端优化技术使流量节省20%
3) 更安全:24小时安全问题解决机制
4) 更稳定:经过亿级用户的使用考验,CRASH率0.15%
5) 集成强大的视频播放器,支持各种视频格式直接打开
6) 适屏排版、字体设置等浏览增强功能的提供
7) Html5更完整支持。
8) 无系统内核的碎片化问题,更少的兼容性问题
目前所负责的项目就接入了x5的sdk,有一点比较吸引的是它能共享微信/手机QQ/空间的X5内核,使用起来更加便捷。