WebView

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.常用属性
  1. 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); 
  1. 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);
    }
}

  1. 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请求,服务器收到请求之后会返还一些数据给客户端,客户端再对这些数据进行解析和处理。
.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值