1、什么是WebView
WebView是Android中UI组件的一种,WebView基于webkit内核(Chromium)。
2、WebView有什么用
WebView可以用来展示网页,并且与网页进行交互。
3、网页的基本组成
1.加载网页。
mWebView.loadUrl("http://www.baidu.com/");
2.加载sd卡中的资源。
mWebView.loadUrl("file://" + Environment.getExternalStorageDirectory().getPath() + "/1/test.html");
3.加载app资源文件种的资源。在src的main文件夹种新建文件夹assets,将要加载的资源放到其中,使用时assets文件夹路径固定写法为:/android_asset/。
mWebView.loadUrl("file://" + "/android_asset/bookmarks.html");
注意,加载sd卡或app资源文件时,路径之前都要加上"file://"。
可以直接将一段html代码加载到WebView当中,参数data是html代码的内容,mimeType是mime类型,参数encoding是编码类型。代码示例如下:
mWebView.loadData("Hello WebView
", "text/html", "utf-8");
网页的前进或者后退都是基于浏览记录来进行的,通过void clearHistory()方法可以清空浏览记录,浏览记录清空后,所有的前进或后退操作都无法再进行。
通知内核暂停所有操作,包括WebView对hrml页面的解析与javaScript的执行等。
激活WebView为活跃状态,表示可以正常执行网页响应。
销毁WebView。
通过与持有该WebView的Activity的生命周期配合使用,防止Activity推出后WebView依然占用资源。
public class WebViewTestActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view_test);
mWebView = findViewById(R.id.activity_web_view_test_web_view);
}
@Override
protected void onPause() {
super.onPause();
mWebView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mWebView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebView.destroy();
}
}
1.WebView是否支持要访问的页面种的JavaScript代码运行。默认不支持,所以会导致JavaScript排版的页面出现混乱。
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
2.WebView是否支持缩放操作。
设置是否支持缩放:
void setSupportZoom(boolean support)
设置内置的缩放控件:
void setBuiltInZoomControls(boolean enabled)
是否隐藏原生的缩放控件:
void setDisplayZoomControls(boolean enabled)
3.WebView对网页的缓存策略。
LOAD_CACHE_ONLY:永远不使用网络,只取本地缓存,没有缓存则不会加载。
LOAD_CACHE_ELSE_NETWORK:只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络。
LOAD_DEFAULT:(默认配置)根据cache-control决定是否从网络获取。
LOAD_NO_CACHE:永远不使用缓存,只从网络获取。
通过setCacheMode方法设置缓存策略,如:
WebSettings webSettings = mWebView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
通过clearCache方法可以清除缓存:
void clearCache(boolean includeDiskFiles)
使用WebView时,必须要添加一句:
mWebView.setWebViewClient(new WebViewClient());
因为WebView的默认配置中,网页的重定向都是由系统默认浏览器打开的,如果不加这一句,就会跳转到系统自带的浏览器。只有指定一个新的WebViewClient,才能在APP本地打开重定向的地址。
常用的处理网页加载时的各种回调通知:
进行资源请求的时候回调,可以通过参数request获取url等信息:
WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
网页已经开始加载的时候回调:
void onPageStarted(WebView view, String url, Bitmap favicon)
加载网页资源之前回调:
void onLoadResource(WebView view, String url)
网页加载完成的时候回调:
void onPageFinished(WebView view, String url)
这4个回调就构成了WebView加载网页时基本的生命周期。shouleInterceptRequest回调和onPageStarted回调的顺序不一定哪个在前,但是一定都在onLoadResource之前。
WebView将要加载新的URL时进行回调:
boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
可以理解为重写跳转到新的URL逻辑,代码示例如下:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if ("http://www.baidu.com/".equals(request.getUrl().toString())) {
//如果要加载的是百度则移花接木给他换成搜狗
view.loadUrl("http://www.sogou.com/");
//return true表示自己处理要加载的URL而不直接由WebView跳转
return true;
}
//默认返回值为false,表示由WebView处理Url
return super.shouldOverrideUrlLoading(view, request);
}
});
网页发生错误的时候回调:
void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
通常在这个回调当中进行错误处理时调用view.loadUrl()将WebView跳转展示错误信息的界面。
下面介绍WebChromeClient中的回调:
1.网页加载过程中的回调
获取网页加载进度的回调(网页加载过程中多次回调,newProgress的值从0到100):
void onProgressChanged(WebView view, int newProgress)
获取网页标题的回调(网页加载过程中回调一次):
void onReceivedTitle(WebView view, String title)
2.网页弹出对话框相关回调
以下3个回调对应JS中的三种对话框,默认的返回值为false,表示由WebView默认处理这次对话框弹出,如果返回值为true,表示由我们自己来处理这次对话框弹出。当我们自己处理对话框弹出操作时,需要调用参数result的confirm()、cancel()等方法来告诉网页我们的处理结果。如果返回值为true而没有调用result的方法通知网页对话框处理结果的话,网页将被阻塞住。
在网页将要打开一个alert警告对话框的时候回调:
boolean onJsAlert(WebView view, String url, String message, JsResult result)
在网页将要打开一个confirm对话框的时候回调:
boolean onJsConfirm(WebView view, String url, String message, JsResult result)
在网页将要打开一个prompt对话框的时候回调:
boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
代码示例:
//示例1
mWebView.loadUrl("javascript:alert(sum(2, 3))");
//示例2
mWebView.evaluateJavascript("javascript:sum(2, 3)", new ValueCallback() {
@Override
public void onReceiveValue(String value) {
//使用Toast弹出sum(2, 3)的结果
Toast.makeText(WebViewTestActivity.this, value, Toast.LENGTH_SHORT).show();
}
});
//todo 抓紧去学一下js,呜呜呜~