WebView相关操作
.
.
.
1.加载网页的四种方式
2.控制网页的前进和后退
3.Webview状态管理
4.webview相关常用类简介
5.控制JS运行
6.控制网页的大小和缩放
7.缓存策略
8.WebViewClient
9.资源请求回调
10.地址拦截
11.WebViewClient发生错误时的处理
12.WebChromeClient处理网页信息
13.android调用JS代码
14.JS调用android代码
1.加载网页的四种方式:
1.1 loadUrl(String url)
这个url可以是web的URL:loadUrl(“https://www.csdn.net/”);
也可以是本地资源文件下的html页面:loadUrl("file:///android_asset/index.html");
说手机SD卡中的页面:
loadUrl(webView.loadUrl("file://"+Environment.getExternalStorageDirectory().getPath()+"index.html")
1.2 loadUrl(String url,Map<String,String> addidionalHttpHeaders)
这个方法是在上述方法的基础上添加了 ddidionalHttpHeaders 参数。这个参数会被添加到RequestHeaders中。
使用方法;
webView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//这里放入了我们自定义的请求头
Map<String,String > reqHeaders = new HashMap<>();
reqHeaders.put("header_key","panghu");
webView.loadUrl(url,reqHeaders);
return super.shouldOverrideUrlLoading(view, request);
}
});
1.3 loadData(String data,String mimeType,String encoding)
这个方法允许我们将一段html代码加载到我们的webview中。
使用方法:
webView.loadData("<h1>HelloWord</>","text/html","utf-8");
1.4 loadData(String baseUrl,String data,String minmeType,Sstring historyUrl)
这个方法是在上边的代码的基础上增加了一个baseUrl和historyUrl参数。这个代表了将baseUrl和data拼接起来之后的路径。historyUrl代表了点击后退时候所跳转的代码。
2.控制网页的前进和后退
所有的前进后者后退都是依靠浏览历史来决定的
关键方法如下:
2.1boolean canGOBack():是否可以后退
2.2 boolean canGoForward():是否可以前进
2.3boolean canGoBackOrForward(int step):是否可以前进或者后退指定步数(正为前进,负为后退)
2.4 void goBack():后退到上一页
2.5 void goForward():前进到下一页
2.6 void goBackOrForward(int steps):前进或者后退到指定步数的页面
2.7 void clearHistory():清空历史记录
3.Webview状态管理:
类似Activity拥有生命周期,webview拥有类似的状态管理:
onPause():通知内核暂停当前网页上的所有动作
onResume():通知内核回复当前网页上的所有动作
onPauesTimers():通知内核暂停所有网页上的动作
onResumeTimers():通知内核恢复所有网页的动作
destory():销毁WebVIew
这些回调函数与Activity的回调函数应该搭配起来使用
4.webview相关常用类简介:
1.webSettings:对webView进行配置和管理
2.WebViewClient:处理网页加载的回调通知
3.WebChromeClient::辅助webview去处理JS对话框标题进度等
5.控制允许JS运行:
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
6.控制网页的缩放:
setSupportZoom(boolean):是否支持缩放
setBuiltInZoomControls(boolwan):设置内置的缩放控件
setDisplayZoomControls(boolean):是否显示原生缩放控件
7.缓存策略:
wetSettings.setCacheMode(MODE_NAME);
MODE_NAME有以下几种方式
**LOAD_CACHE_ONLY:**永远不使用缓存
**LOAD_CACHE_ELSE_NETWORK:**只要本地有缓存就使用本地缓存,本地没有缓存就加载网络资源
LOAD_DEFAULT(默认):根据cache_control决定是否使用缓存
**LOAD_NO_CACHE:**永远不使用缓存,只从网络获取
8.WebViewClient:
处理网页的各种回调通知
webView.setWebViewClient(new WebViewClient()
{
/**
*在webview进行请求之前进行回调
* @param view
* @param url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
/**
* 在webview进行请求之前进行回调 ,仅在5.0以后可以使用
* @param view
* @param request
* @return
*/
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
/**
* 在网页加载的 时候进行回调
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
/**
* 网页开始加载资源
* @param view
* @param url
*/
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
/**
* 网页加载完毕
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
10.地址拦截
同样在webclient的回调方法中,有一个方法为:
boolwan shouldOverrideUrlLoading(WebView view ,String url):在将要加载新的url的时候进行回调
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return super.shouldInterceptRequest(view, url);
}
/**
*
* @param view
* @param request
* @return 返回false的时候代表webview进行处理新的请求,返回true的时候代表我们进行处理
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if("http://www.baidu.com".equals(request.getUrl()))
{
view.loafUrl("http://www.mooc.com")
return true;
}
return super.shouldOverrideUrlLoading(view, request);
}
11.WebViewClient发生错误时的处理:
/**
* 在6.0以后使用
* @param view
* @param request
* @param error
*/
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
12.WebChromeClient处理网页信息:
几个重要的回调方法:
webView.setWebChromeClient(new WebChromeClient()
{
/**
* 获取网页加载的进度
* @param view
* @param newProgress
*/
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
/**
* 获取网页的标题
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
/**
* 网页将要打开一个Alert的时候进行回调
* @param view
* @param url
* @param message
* @param result
* @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理
*/
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
/**
* 在网页将要打开一个confirm对话框的时候进行回调
* @param view
* @param url
* @param message
* @param result
* @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理
*/
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
/**
* 在网页将要打开一个Prompt对话框的时候进行回调
* @param view
* @param url
* @param message
* @param defaultValue
* @param result
* @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
});
在后面三个弹出框中,如果我们要自行处理逻辑,需要将我们的结果返回给JS代码。我们可以利用result这个参数的result.confirm()或者result.cancel().方法来将结果提交给JS
13.android调用JS代码:
webview.loadUrl("javaScript::${functionName}") //不需要返回值时调用
//需要返回值时调用 api>19
webView.evaluateJavascript("javascript:${functionName}", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
});
14.JS调用android代码:
在上方我们进行访问拦截的时候,我们获取到将要跳转的域名,然后根据域名来进行拦截。其实我们也可以用域名来传递某些信息:假设我们的域名为“android://print?msg = 123”.
那我们就可以根据这个域名来抵用我们安卓本地的print方法。代码如下:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri = Uri.parse(url);
if("android".equals(uri.getScheme()))//协议名为android,表示为商定好的协议
{
String funcName = uri.getAuthority();
if ("print".equals(funcName))
{
String msg = uri.getQueryParameter("msg");
print(msg);
}
}
return true;
}
private void print(String msg) {
Log.d("panghu", "print: "+msg);
}
这样就完成了JS调用Android代码的功能。当我们需要返回一些数据的时候,我们可以利用android调用JS的方法时候,将数据作为参数调用JS的固定方法。
使用对象映射的方式(在4.2之后可以使用):
首先我们要有一个映射类:
public class DemoObject {
@JavascriptInterface
public String print(String msg)
{
Log.d(TAG, "print: "+msg);
return "fanhuizhi";
}
}
然后调用:
webView.addJavascriptInterface(new DemoObject(),"android");
为这个类的对象起一个名字“android”。然后再html中,我们有一个JS函数是这样的:
function getMsg()
{
var result = android.print("hahaha") //这个result就是android代码给我们的返回值
}
关于WebView的使用就是这些,有不足的地方后续再完善