一.常用方法
- 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<String> 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计时器,将恢复调度所有计时器.
二.webview的初始化方法
mWebView.loadUrl("//www.greatytc.com/u/0b440912217a");// 加载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();// 生命周期销毁
三.webView常用的配置
主要有WebSettings、WebViewClient、WebChromeClient。
1.websettings常用方法和项目配置
- 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);
2.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 MyWebViewClient 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);
}
}
3.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 MyWebChromeClient 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文件上传,由于webview原生的碎片化,这里的上传需要多测试一些机型**/
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
if (mUploadMessage != null) return;
mUploadMessage = uploadMsg;
showPhotoView();
}
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
if (mUploadCallbackAboveL != null){
return false;
}
mUploadCallbackAboveL = filePathCallback;
showPhotoView();
return true;
}
}
4.webView和Js的相互调用
四.常见的一些问题
webView使用遇到的坑(一)
webView使用遇到的坑(二)
webView的使用之调试
webView的性能优化