WebView
简介
android中重要的控件,用来展示web页面,内核为 webkit,内部浏览器为谷歌
用处
1.展示web页面
2.js交互,混合开发
运用
1.基本使用
//配置网络权限
<uses-permission android:name="android.permission.INTERNET"/>
//布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.webview.SafeWebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
// BaseWebView 是已封装的 WebView
//实际使用时请采用 new 的方式
mWebView = (SafeWebView) findViewById(R.id.web_view);
mWebView.addJavascriptInterface(new NativeInterface(this), "AndroidNative");
mWebView.loadUrl("http://www.jianshu.com/u/fa272f63280a");
2.常用方法
- void loadUrl(String url):加载网络链接 url
- boolean canGoBack():判断 WebView 当前是否可以返回上一页
- goBack():回退到上一页
- boolean canGoForward():判断 WebView 当前是否可以向前一页
- goForward():回退到前一页
- onPause():类似 Activity 生命周期,页面进入后台不可见状态
- pauseTimers():该方法面向全局整个应用程序的webview,它会暂停所有webview的layout, parsing,JavaScript Timer。当程序进入后台时,该方法的调用可以降低CPU功耗。
- onResume():在调用 onPause()后,可以调用该方法来恢复 WebView 的运行。
- resumeTimers():恢复pauseTimers时的所有操作。(注:pauseTimers和resumeTimers 方法必须一起使用,否则再使用其它场景下的 WebView 会有问题)
- destroy():销毁 WebView
- clearHistory():清除当前 WebView 访问的历史记录。
- clearCache(boolean includeDiskFiles):清空网页访问留下的缓存数据。需要注意的时,由于缓存是全局的,所以只要是WebView用到的缓存都会被清空,即便其他地方也会使用到。该方法接受一个参数,从命名即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的。
- reload():重新加载当前请求
- setLayerType(int layerType, Paint paint):设置硬件加速、软件加速
- removeAllViews():清除子view。
- clearSslPreferences():清除ssl信息。
- clearMatches():清除网页查找的高亮匹配字符。
- removeJavascriptInterface(String interfaceName):删除interfaceName 对应的注入对象
- addJavascriptInterface(Object object,String interfaceName):注入 java 对象。
- setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled):设置垂直方向滚动条。
- setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled):设置横向滚动条。
- loadUrl(String url, Map<String, String> additionalHttpHeaders):加载制定url并携带http header数据。
- evaluateJavascript(String script, ValueCallback resultCallback):Api 19 之后可以采用此方法之行 Js。
- stopLoading():停止 WebView 当前加载。
- clearView():在Android 4.3及其以上系统这个api被丢弃了, 并且这个api大多数情况下会有bug,经常不能清除掉之前的渲染数据。官方建议通过loadUrl(“about:blank”)来实现这个功能,阴雨需要重新加载一个页面自然时间会收到影响。
- freeMemory():释放内存,不过貌似不好用。
- clearFormData():清除自动完成填充的表单数据。需要注意的是,该方法仅仅清除当前表单域自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
使用中的一些问题
- onPause() 尽力尝试暂停可以暂停的任何处理,如动画和地理位置。 不会暂停JavaScript。
要全局暂停JavaScript,可使用pauseTimers。- onResume() 恢复onPause() 停掉的操作;
- pauseTimers() 暂停所有WebView的布局,解析和JavaScript定时器。
这个是一个全局请求,不仅限于这个WebView。- resumeTimers() 恢复所有WebView的所有布局,解析和JavaScript计时器,将恢复调度所有计时器.
- 另外注意 JS端setTimeout()、setInterval() 方法使用,自测来看,当不使用 pauseTimers() 和
pauseTimers() ,从 Activity 返回上一个包含WebView 的Activity时,页面里的 setTimeout()
是不执行的,setInterval() 是可以恢复执行的。- 在适当的生命周期使用 pauseTimers() 和 pauseTimers() 既可以恢复setTimeout() 执行。
3.webview方法清单
mWebView.loadUrl("http://www.jianshu.com/u/fa272f63280a");// 加载url,也可以执行js函数
mWebView.setWebViewClient(new SafeWebViewClient());// 设置 WebViewClient
mWebView.setWebChromeClient(new SafeWebChromeClient());// 设置 WebChromeClient
mWebView.onResume();// 生命周期onResume
mWebView.resumeTimers();//生命周期resumeTimers
mWebView.onPause();//生命周期onPause
mWebView.pauseTimers();//生命周期pauseTimers (上数四个方法都是成对出现)
mWebView.stopLoading();// 停止当前加载
mWebView.clearMatches();// 清除网页查找的高亮匹配字符。
mWebView.clearHistory();// 清除当前 WebView 访问的历史记录
mWebView.clearSslPreferences();//清除ssl信息
mWebView.clearCache(true);//清空网页访问留下的缓存数据。需要注意的时,由于缓存是全局的,所
以只要是WebView用到的缓存都会被清空,即便其他地方也会使用到。该方法接受一个参数,从命名
即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的。
mWebView.loadUrl("about:blank");// 清空当前加载
mWebView.removeAllViews();// 清空子 View
if (Build.VERSION.SDK_INT <Build.VERSION_CODES.JELLY_BEAN_MR2) {
mWebView.removeJavascriptInterface("AndroidNative");// 向 Web端注入 java 对象
}
mWebView.destroy();// 生命周期销毁
4.常用属性
- WebSetting
setJavaScriptEnabled(boolean flag):是否支持 Js 使用。
setCacheMode(int mode):设置 WebView 的缓存模式。
setAppCacheEnabled(boolean flag):是否启用缓存模式。
setAppCachePath(String appCachePath):Android 私有缓存存储,如果你不调用setAppCachePath方法,WebView将不会产生这个目录。
setSupportZoom(boolean support):是否支持缩放。
setTextZoom(int textZoom):Sets the text zoom of the page in percent. The default is 100。
setAllowFileAccess(boolean allow):是否允许加载本地 html 文件/false。
setDatabaseEnabled(boolean flag):是否开启数据库缓存
setDomStorageEnabled(boolean flag):是否开启DOM缓存。
setUserAgentString(String ua):设置 UserAgent 属性。
setLoadsImagesAutomatically(boolean flag):支持自动加载图片
setAllowFileAccessFromFileURLs(boolean flag::允许通过 file url 加载的 Javascript 读取其他的本地文件,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止。
setAllowUniversalAccessFromFileURLs(boolean flag):允许通过 file url 加载的 Javascript 可以访问其他的源,包括其他的文件和 http,https 等其他的源,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用。
boolean getLoadsImagesAutomatically():是否支持自动加载图片。
WebSettings webSettings = mWebView.getSettings();
if (webSettings == null) return;
// 支持 Js 使用
webSettings.setJavaScriptEnabled(true);
// 开启DOM缓存 webSettings.setDomStorageEnabled(true);
// 开启数据库缓存
webSettings.setDatabaseEnabled(true);
// 支持自动加载图片
webSettings.setLoadsImagesAutomatically(hasKitkat());
// 设置 WebView 的缓存模式
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
// 支持启用缓存模式 webSettings.setAppCacheEnabled(true);
// 设置 AppCache 最大缓存值(现在官方已经不提倡使用,已废弃)
webSettings.setAppCacheMaxSize(8 * 1024 * 1024);
// Android 私有缓存存储,如果你不调用setAppCachePath方法,WebView将不会产生这个目录
webSettings.setAppCachePath(getCacheDir().getAbsolutePath());
// 数据库路径
if (!hasKitkat()) { webSettings.setDatabasePath(getDatabasePath("html").getPath()); }
// 关闭密码保存提醒功能
webSettings.setSavePassword(false);
// 支持缩放
webSettings.setSupportZoom(true);
// 设置 UserAgent 属性
webSettings.setUserAgentString("");
// 允许加载本地 html 文件/false
webSettings.setAllowFileAccess(true);
// 允许通过 file url 加载的 Javascript 读取其他的本地文件,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止 webSettings.setAllowFileAccessFromFileURLs(false);
// 允许通过 file url 加载的 Javascript 可以访问其他的源,包括其他的文件和 http,https 等其他的源,
// Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止
// 如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用
webSettings.setAllowUniversalAccessFromFileURLs(false);
- WebViewClient
onPageStarted(WebView view, String url, Bitmap favicon):WebView 开始加载页面时回调,一次 Frame加载对应一次回调。
onLoadResource(WebView view, String url):WebView 加载页面资源时会回调,每一个资源产生的一次网络加载,除非本地有当前 url 对应有缓存,否则就会加载。
shouldInterceptRequest(WebView view, String url):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。
shouldInterceptRequest(WebView view, android.webkit.WebResourceRequest request):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。
shouldOverrideUrlLoading(WebView view, String url):是否在 WebView 内加载页面。
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):WebView ssl 访问证书出错,handler.cancel()取消加载,handler.proceed()对然错误也继续加载。
onPageFinished(WebView view, String url):WebView 完成加载页面时回调,一次Frame加载对应一次回调。
onReceivedError(WebView view, int errorCode, String description, String failingUrl):WebView 访问 url 出错。
public class SafeWebViewClient extends WebViewClient {
/**
* 当WebView得页面Scale值发生改变时回调
*/
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
}
/**
* 是否在 WebView 内加载页面
*
* @param view
* @param url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
/**
* WebView 开始加载页面时回调,一次Frame加载对应一次回调
*
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
/**
* WebView 完成加载页面时回调,一次Frame加载对应一次回调
*
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
/**
* WebView 加载页面资源时会回调,每一个资源产生的一次网络加载,除非本地有当前 url 对应有缓存,否则就会加载。
*
* @param view WebView
* @param url url
*/
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
/**
* WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。
*
* @param view WebView
* @param request 当前产生 request 请求
* @return WebResourceResponse
*/
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
/**
* WebView 访问 url 出错
*
* @param view
* @param request
* @param error
*/
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
/**
* WebView ssl 访问证书出错,handler.cancel()取消加载,handler.proceed()对然错误也继续加载
*
* @param view
* @param handler
* @param error
*/
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
}
}
- WebChromeClient
onConsoleMessage(String message, int lineNumber,String sourceID):输出 Web 端日志。
onProgressChanged(WebView view, int newProgress):当前 WebView 加载网页进度。
onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):处理 JS 中的 Prompt对话框
onJsAlert(WebView view, String url, String message, JsResult result): Js 中调用 alert() 函数,产生的对话框。
onReceivedTitle(WebView view, String title):接收web页面的 Title。
onReceivedIcon(WebView view, Bitmap icon):接收web页面的icon。
public class SafeWebChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
return super.onConsoleMessage(consoleMessage);
}
/**
* 当前 WebView 加载网页进度
*
* @param view
* @param newProgress
*/
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
/**
* Js 中调用 alert() 函数,产生的对话框
*
* @param view
* @param url
* @param message
* @param result
* @return
*/
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
/**
* 处理 Js 中的 Confirm 对话框
*
* @param view
* @param url
* @param message
* @param result
* @return
*/
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
/**
* 处理 JS 中的 Prompt对话框
*
* @param view
* @param url
* @param message
* @param defaultValue
* @param result
* @return
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
/**
* 接收web页面的icon
*
* @param view
* @param icon
*/
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
/**
* 接收web页面的 Title
*
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
}
webview与js的交互
声明访问网络权限
<uses-permission android:name="android.permission.INTERNET"/>//声明访问网络权限
显示外部网页
webview.loadUrl("http://slashdot.org/");
//例子
myWebView = (WebView) findViewById(R.id.myWebView);
myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl("http://www.baidu.com");
加载本地资源
webview.loadUrl("file:///android_asset/test.html");
显示html语句
String summary="<html><body>You scored<b>192</b>points.</body></html>";
webview.loadData(summary,"text/html",null);
回退一次
//回退一次
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == event.KEYCODE_BACK) {
if (myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
}
return true;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView=(WebView) findViewById(R.id.web_view);//通过id获取webview实例
webView.getSettings().setJavaScriptEnabled(true);//调用getSetting方法设置webview支持js脚本
webView.setWebViewClient(new WebViewClient());//设置当网页跳转时仍然在webview中显示,而不开系统浏览器
webView.loadUrl("http://www.baidu.com");//传入网址
}
HTTP协议
就是客户端向服务器发送一条HTTP请求,服务器收到请求之后会返还一些数据给客户端,客户端再对这些数据进行解析和处理。
.