本文介绍: 现在很多 App 里都内置了 Web 网页比如电商平台淘宝、京东等。那么这种该如何实现呢?其实这是 Android一个叫WebView的组件实现的。下面将介绍 WebView 的常用用法。WebView 是一个基于 webkit引擎、展现 web 页面控件。Android 的 WebView 在低版本和高版本采用了不同的 webkit 版本内核,4.4 后直接使用了 Chrome。本文主要对 Android Webview进行了全面介绍关于WebView的系列文章希望对你有所帮助。

目录

前言

1、简介

2、作用

3、使用

3.1 WebView 常用方法

3.1.1 WebView 的状态

3.1.2 前进/后退网页

3.1.3 清楚缓存数据

3.2 WebView 常用子类 

3.2.2 WebViewClient 类

 3.2.3 WebChromeClient 类

3.3 注意事项

4、总结

前言

        现在很多 App 里都内置了 Web 网页比如电商平台淘宝、京东等。那么这种该如何实现呢?其实这是 Android一个WebView组件实现的。下面将介绍 WebView 的常用用法

1、简介

        WebView 是一个基于 webkit引擎、展现 web 页面控件。Android 的 WebView 在低版本和高版本采用了不同的 webkit 版本内核,4.4 后直接使用了 Chrome。

2、作用

        bullet 显示渲染 Web 页面

        bullet 直接使用 html 文件(网络上或本地 assets 中)作布局

        bullet 可和 JavaScript 交互调用

WebView 控件功能强大,除了具有一般 View 的属性设置外,还可以对 URL 请求页面加载渲染页面交互进行强大的处理

3、使用

        bullet WebView自身的常见方法

        bullet WebView 的最常用的子类(WebSettiongs类、WebViewClient类、WebChromeClient类);

        bullet Android 和 Js交互

3.1 WebView 常用方法

3.1.1 WebView 的状态

// 激活 WebView 为活跃状态,能正常执行网页响应
webView.onResume(); //当页面失去焦点被切换后台不可见状态,需要执行 onPause
// 通过 onPause 动作通知内核暂停所有的动作比如 DOM 解析plugin执行,JavaScript 执行
webView.onPause(); //当应用程序(存在 webView)被切换后台时,这个方法不仅仅针对当前webview而时全局的全应用webview
//它会暂停所有的 webviewlayout, parsion, javaScripttimer。降低 CPU 功耗。webView.pauseTimers()
//恢复 pauseTimers 状态
webView.resumeTimers(); //销毁 WebView
// 在关闭了 Activity 时,如果 WebView 的音乐视频还在播放,就必须销毁 WebView
// 注意:webview 调用 destory 时,webview绑定在 Activity 上
// 这是由于自定义 webview 构建时传入了该 Activitycontext 对象
// 因此需要先从父容器中移除 webview 然后再销毁 webview
rootLayout.removeView(webview);
webview.destory();

3.1.2 前进/后退网页

// 是否可以后退
Webview.canGoBack()
// 后退网页
Webview.goBack()

// 是否可以前进
Webview.canGoForward()
// 前进网页
Webview.goForward()

// 以当前index 为起始点前进或者后退到历史记录指定steps
// 如果 steps 为负数则为后退,正数则为前进
Webview.goBackOrForward(intsteps)

常见用法:Back控制网页后退

  bullet 问题:在不做任何处理前提下,浏览网页时点击系统的 “Back” 键,整个 Browser 会调用 finish() 而结束自身

  bullet 目标点击返回后,是网页回退而不是退出浏览器

  bullet 解决方案:在当前 Activity处理并消费掉该 Back 事件

public boolean onKeyDown(int keyCode, KeyEvent event){
    if((keyCode == KEYCODE_BACK) && (mWebView.canGoBack()){
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

3.1.3 清楚缓存数据

// 清除网页访问留下的缓存
// 由于内核缓存全局的,因此这个方法不仅仅针对 webview 而是针对整个应用程序
Webview.clearCache(true);

// 清楚当前 webview 访问的历史记录
// 只会 webview 访问历史记录里的所有记录除了当前访问记录
Webview.clearHistory();
 // 这个 API 仅仅清楚自动完成填充表单数据,并不会清除 webview 存储本地数据
webview.clearFormData();

3.2 WebView 常用子类 

3.2.1 WebSettings

  bullet 作用:对 WebView 进行配置管理

 bullet  配置步骤 & 常见方法

配置步骤1:添加网络权限(AndroidManifest.xml)这是前提!

<uses-permission android:name="android.permission.INTERNET"/>

 配置步骤2:生成一个 WebView 组件(两种方式

// 方式1:直接在 Activity 中生成
WebView webView = new WebView(this)

// 方式2:在 Activity 的 layout 文件添加 webview 控件;
WebView webview = (WebView) findViewById(R.id.webview)

配置步骤3:进行配置利用 WebSettings 子类常见方法)

// 声明 WebSettings 子类
WebSettings webSettings = webView.getSettings();

// 如果访问页面要与 JavaScript 交互,则 webview 必须设置支持 JavaScript
webSettings.setJavaScriptEnabled(true);

// 支持插件
webSettings.setPluginEnabled(true);

// 设置适应屏幕,两者合用
webSettings.setUseWideViewPort(true); // 将图片调整到适合 webview 的大小
webSettings.setLoadWithOverviewMode(ture); // 缩放屏幕大小

// 缩放操作
webSettings.setSupportZoom(true); // 支持缩放,默认true, 是下面那个的前提;
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(flase); //隐藏原生的缩放控件

// 其它细节操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 
webSettings.setAllowFileAccess(true); //设置可以访问文件 
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开窗口 
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

常见用法:设置 WebView 缓存 

  bullet 当加载 html 页面时,WebView 会在 /data/data/包名目录下生成 databasecache 两个文件夹

  bullet 请求的 URL 记录保存在 WebViewCache.db,而 URL 的内容是在 WebViewCache 文件夹

  bullet 是否启用缓存

// 优先使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 缓存模式如下:
// LOAD_CACHE_ONLY: 不使用网络只读本地缓存数据
// LOAD_DEFAULT: (默认)根据 cache-control 决定是否网络获取数据
// LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
// LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据

WebView.getSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

  bullet 结合使用(离线加载)

if(NetStatusUtil.isConnected(getApplicationContext())){
    // 根据 cache-control 决定是否从网上获取数据
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
    } else{
        // 没网,则从本地获取,即离线加载
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能
webSettings.setDatabaseEnabled(true); // 开启 database storage API 功能
webSettings.setAppCacheEnabled(true); // 开启 Application Caches 功能

String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACHE_DIRNAME;
webSettings.setAppCachePath(cacheDirPath); // 设置 Application Caches 缓存目录

 注意:每个 Application 只调用一次 WebSettings.setAppCachePath(), WebSettings.setAppCacheMaxSize()。

3.2.2 WebViewClient 类

  bullet 作用处理各种通知 &amp; 请求事件

  bullet 常见方法:

常见方法1:shouldOverrideUrlLoading()

  bullet 作用:打开网页时不调用系统浏览器,而是在本地 WebView 中显示;在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。

// 步骤1,定义 Webview 组件
Webview webview = (Webview) findViewById(R.id.webView1);

// 步骤2,选择加载方式
    // 方式1,加载一个网页:
webView.loadUrl("https://www.google.com/");

    // 方式2,加载 apk 包中的 html 页面
webView.loadUrl("file:///android_asset/test.html");

    // 方式3,加载手机本地的 html 页面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

// 步骤3,复写shouldOverrideUrlLoading() 方法,使得打开网页时不调用系统浏览器,而是在本地 webView 中显示
webView.setWebViewClient(new WebViewClient(){
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
      return true;
      }
  });

常用方法2:onPageStarted()

  bullet 作用:开始载入页面时调用我们可以设定一个 loading 的页面,告诉用户程序等待网络响应

webView.setWebViewClient(new WebViewClient(){
      @Override
      public void  onPageStarted(WebView view, String url, Bitmap favicon) {
         //设定加载开始的操作
      }
  });  

 常用方法3:onPageFinished()

  bullet 作用:在页面加载结束时调用。我们可以关闭 loading 条,切换程序动作

webView.setWebViewClient(new WebViewClient(){
      @Override
      public void onPageFinished(WebView view, String url) {
         //设定加载结束的操作
      }
  });

 常用方法4:onLoadResource()

  bullet 作用:在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次

 webView.setWebViewClient(new WebViewClient(){
      @Override
      public boolean onLoadResource(WebView view, String url) {
         //设定加载资源的操作
      }
  });

  常用方法5:onReceivedError()

  bullet 作用:加载页面的服务器出错时调用。

App 里面使用 webview 控件的时候遇到了诸如404这类错误时候,若也显示浏览器里面的那种错误提示页面就显得很丑陋,那么这个时候我们的 app需要加载一个本地的错误提示页面,即 webview 如何加载一个本地的页面。

//步骤1:写一个html文件error_handle.html),用于出错时展示用户看的提示页面
//步骤2:将该html文件放置代码根目录assets文件夹下

//步骤3:复写WebViewClient的onRecievedError方法
//该方法传回了错误码,根据错误类型可以进行不同的错误分类处理
webView.setWebViewClient(new WebViewClient(){
      @Override
      public void onReceivedError(WebView view, int errorCode, String description, String             
                                    failingUrl){
                switch(errorCode)
                {
                case HttpStatus.SC_NOT_FOUND:
                    view.loadUrl("file:///android_assets/error_handle.html");
                    break;
                }
            }
        });

常用方法6:onReceivedSsIError()

  bullet 作用:处理 https 请求

webview 默认是不处理 https 请求的,页面显示空白需要进行如下设置:


webView.setWebViewClient(new WebViewClient() {    
        @Override    
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {    
            handler.proceed();    //表示等待证书响应
        // handler.cancel();      //表示挂起连接,为默认方式
        // handler.handleMessage(null);    //可做其他处理
        }    
    });   

 3.2.3 WebChromeClient 类

  bullet 作用:辅助 WebView 处理 JavaScript 的对话框网站图标网站标题等等。

  bullet 常见方法:

常用方法1:onProgressChanged()

  bullet 作用:获得网页加载进度显示

webview.setWebChromeClient(new WebChromeClient(){

      @Override
      public void onProgressChanged(WebView view, int newProgress) {
          if (newProgress < 100) {
              String progress = newProgress + "%";
              progress.setText(progress);
            } else {
        }
    });

 常用方法2:onReceivedTitle()

   bullet 作用:获取 web 页中的标题

webview.setWebChromeClient(new WebChromeClient(){

    @Override
    public void onReceivedTitle(WebView view, String title) {
       titleview.setText(title);  
 }

3.3 注意事项

如何避免 WebView 内存泄漏

不在 xml定义 webview,而是在需要时候在 Activity 中创建,并且 Context 使用 getApplicationContext()

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mWebView = new WebView(getApplicationContext());
mWebView.setLayoutParams(params);
mLayout.addView(mWebView);

在 Activity 销毁(WebView)的时候,先让 WebView 加载 null 内容然后移除 WebView,再销毁 WebView,最后置空。

@Override
    protected void onDestroy() {
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebView.clearHistory();

            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }

4、总结

  • 本文主要对 Android Webview进行了全面介绍

  • 关于WebView的系列文章希望对你有所帮助

参考文章Android:最全面的 Webview 详解

原文地址:https://blog.csdn.net/qq_44950283/article/details/128925755

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_27680.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注