一手遮天 Android - view(WebView): WebView 基础

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 Android - view(WebView): WebView 基础

示例如下:

/view/webview/WebViewDemo1.java

/**
 * WebView 基础
 *     loadUrl("https://www.baidu.com") - 加载一个 http 或 https 的网页
 *     loadUrl("file:///android_asset/xxx.html"), loadUrl("file:///android_res/xxx.html") - 加载包内的 html 文件
 *     loadUrl("file://" + Environment.getExternalStorageDirectory().getAbsolutePath() + "/xxx.html") - 加载存储中的 html 文件
 *     loadDataWithBaseURL(null, "html content", "text/html", "utf-8", null) - 加载指定的 html 字符串
 */

package com.webabcd.androiddemo.view.webview;

import android.graphics.Bitmap;
import android.net.http.SslError;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import com.webabcd.androiddemo.R;

public class WebViewDemo1 extends AppCompatActivity {

    private TextView mTextView1;
    private TextView mTextView2;
    private TextView mTextView3;
    private WebView mWebView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_webview_webviewdemo1);

        mTextView1 = findViewById(R.id.textView1);
        mTextView2 = findViewById(R.id.textView2);
        mTextView3 = findViewById(R.id.textView3);
        mWebView1 = findViewById(R.id.webView1);

        sample();
    }

    private void sample() {
        // clearCache(boolean includeDiskFiles) - 清除缓存
        //     false - 仅清除内存缓存
        //     true - 清除内存缓存和硬盘缓存
        mWebView1.clearCache(true);
        // clearHistory() - 清除访问的历史记录
        mWebView1.clearHistory();
        // clearFormData() - 清除表单的自动完成填充的数据
        mWebView1.clearFormData();


        // canGoBack(), goBack(), canGoForward(), goForward() - 页面导航管理,含义分别为:是否可以后退,后退网页,是否可以前进,前进网页
        // canGoBackOrForward(int steps), goBackOrForward(int steps) - 能后退或前进的步数,后退或前进指定步数的网页。负数为后退,正式为前进
        // reload(), stopLoading() - 刷新页面,停止加载


        // 当 WebView 不可见或切换到后台时,通过如下接口来降低 cpu 的占用
        // onPause(), onResume() - 停止 js 的执行,恢复 js 的执行
        // pauseTimers(), resumeTimers() - 停止 js 的计时器的执行,恢复 js 的计时器的执行


        // getSettings() - 获取 WebSettings 对象,用于对 WebView 做一些设置
        WebSettings webSettings = mWebView1.getSettings();

        // setJavaScriptEnabled() - 是否启用 javascript 支持
        webSettings.setJavaScriptEnabled(true);

        // setUseWideViewPort() - 是否启用对 html 中 viewport 的支持
        webSettings.setUseWideViewPort(true);
        // setLoadWithOverviewMode() - 是否需要缩小内容以适应屏幕的宽度
        webSettings.setLoadWithOverviewMode(true);

        // setSupportZoom() - 是否需要支持缩放
        webSettings.setSupportZoom(true);
        // setBuiltInZoomControls() - 是否启用 WebView 内置的缩放功能
        webSettings.setBuiltInZoomControls(true);
        // setDisplayZoomControls() - 是否显示缩放按钮
        webSettings.setDisplayZoomControls(false);

        // setCacheMode() - 指定缓存方式
        //     LOAD_DEFAULT - 根据 html 中的 cache-control 决定是否从网络上请求数据,默认值
        //     LOAD_CACHE_ONLY - 不请求网络,只读取本地缓存数据
        //     LOAD_NO_CACHE - 不使用本地缓存,只从网络请求数据.
        //     LOAD_CACHE_ELSE_NETWORK - 优先从本地缓存获取数据,没有的话则请求网络
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        // setAllowFileAccess() - 是否可以访问本地存储文件(比如通过 file 协议访问 sd 卡中的资源)(注:通过 file 协议访问包内资源不会受此影响)
        webSettings.setAllowFileAccess(true);
        // setJavaScriptCanOpenWindowsAutomatically() - 是否支持 javascript 打开新窗口
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        // setLoadsImagesAutomatically() - 是否自动加载图片资源
        webSettings.setLoadsImagesAutomatically(true);
        // setDefaultTextEncodingName() - 指定编码格式
        webSettings.setDefaultTextEncodingName("UTF-8");
        // setMixedContentMode() - 设置 http 和 https 混用的模式
        //     MIXED_CONTENT_ALWAYS_ALLOW - 允许加载的 https 页面引用 http 资源
        //     MIXED_CONTENT_NEVER_ALLOW - 不允许加载的 https 页面引用 http 资源
        //     MIXED_CONTENT_COMPATIBILITY_MODE - 加载 https 页面后,由系统决定其引用的哪类 http 资源可以加载,哪类 http 资源不可以加载
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);


        // loadUrl() - 加载指定的 url
        mWebView1.loadUrl("https://www.baidu.com");
        // setWebViewClient() - 事件监听
        mWebView1.setWebViewClient(webViewClient);
        // setWebChromeClient() -  事件监听
        mWebView1.setWebChromeClient(webChromeClient);
    }

    // WebViewClient 事件监听
    private WebViewClient webViewClient = new WebViewClient() {
        // 开始加载
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            mTextView1.setText("onPageStarted");
        }

        // 加载完成
        @Override
        public void onPageFinished(WebView view, String url) {
            mTextView1.setText("onPageFinished");
        }

        // 加载任意资源时的回调(比如请求 html, css, js, jpg 等资源时都会触发此函数)
        @Override
        public void onLoadResource(WebView view, String url) {
            mTextView3.setText(String.format("onLoadResource: %s", url));
        }

        // 加载失败(errorCode 为 http status code)
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){

        }

        // 加载 https 失败
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // 取消
            // handler.cancel();

            // 继续
            // handler.proceed();
        }
    };

    // WebChromeClient 事件监听
    private WebChromeClient webChromeClient = new WebChromeClient() {
        // 加载进度(0 - 100 之间)
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            mTextView1.setText(String.format("onProgressChanged: %d", newProgress));
        }

        // 拿到 html 中的 title
        @Override
        public void onReceivedTitle(WebView view, String title) {
            mTextView2.setText(String.format("onReceivedTitle: %s", title));
        }
    };

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 用户按下返回键时,如果页面可后退则后退
        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView1.canGoBack()) {
            mWebView1.goBack();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    // 释放资源
    @Override
    protected void onDestroy() {
        // 从父容器中移除 WebView
        ((ViewGroup) mWebView1.getParent()).removeView(mWebView1);
        // 移除 WebView 内的所有控件
        mWebView1.removeAllViews();
        // destroy() - 销毁
        mWebView1.destroy();
        mWebView1 = null;

        super.onDestroy();
    }
}

/layout/activity_view_webview_webviewdemo1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="middle" />

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2021-06-02 08:30  webabcd  阅读(148)  评论(0编辑  收藏  举报