您的位置:

Android WebView的使用

一、 WebView的基本介绍

WebView是Android开发中的一个非常重要的控件,它可以让我们在应用程序中加载并显示网页、图片等替代在浏览器中访问。不仅如此,WebView也可以实现JavaScript与Java之间的相互调用、页面内容的持久化、缓存和离线存储等。

1、通过XML定义WebView

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

2、通过代码定义WebView

    WebView webView = new WebView(this);
        setContentView(webView);
        webView.loadUrl("http://www.example.com");

二、 WebView的设置与用法

1、设置WebViewClient和WebChromeClient

使用setWebViewClient()设置WebViewClient可以让WebView在当前应用程序中加载网页,而不是跳转到系统浏览器中。

使用setWebChromeClient()设置WebChromeClient可以接收WebView的一些通知信息,如网页标题改变、加载进度等。

    webView.setWebViewClient(new WebViewClient() {
            // 当页面加载完毕后回调
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }
        });

2、WebView的基本设置

WebView提供了很多基本设置,包括加载缓存、JavaScript支持、缩放控制等。

    // 启用JavaScript支持
        webView.getSettings().setJavaScriptEnabled(true);

        // 设置允许访问文件
        webView.getSettings().setAllowFileAccess(true);

        // 不缩放
        webView.getSettings().setBuiltInZoomControls(false);

        // 开启DOM storage
        webView.getSettings().setDomStorageEnabled(true);

        // 缓存模式:不使用缓存
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

        // 支持缩放
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setUseWideViewPort(true);

3、WebView的前进与后退

我们可以通过调用goBack()和goForward()方法让WebView前进或后退页面。

    // 前进
        if (webView.canGoForward()) {
            webView.goForward();
        }

        // 后退
        if (webView.canGoBack()) {
            webView.goBack();
        }

4、JavaScript与Java的交互

如果需要在WebView中执行一些JavaScript脚本并获取它们的返回结果,我们可以通过调用evaluateJavascript()方法实现。

而在WebView中调用Java方法,则需要通过JSBridge注入JavaScript代码实现。

(1)evaluateJavascript()方法

evaluateJavascript()方法有两个参数:要执行的JavaScript代码和返回结果的回调函数。下面是一个简单的例子,它使用evaluateJavascript()方法获取网页中的标题信息。

    // 加载完成监听器
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                // 获取标题
                webView.evaluateJavascript("javascript:document.title", new ValueCallback
   () {
                    @Override
                    public void onReceiveValue(String value) {
                        Log.d(TAG, "onReceiveValue: " + value);
                    }
                });
            }
        });
   

(2)JSBridge实现JavaScript与Java的互调

JSBridge是一种基于WebView的JavaScript与Java相互调用桥梁,它可以在WebView中inject一个JavaScript对象,在JavaScript中调用Java类的方法、获取Java对象的属性等。

下面是一个简单的例子,它演示了如何在JavaScript中调用Android中的一个方法,方法接收一个字符串参数并返回一个字符串结果。

    // 添加JSBridge
        WebView.addJavascriptInterface(new Object() {
            @JavascriptInterface
            public String callAndroid(String arg) {
                // 调用方法并返回结果
                return "Hello, " + arg;
            }
        }, "jsBridge");

        // 在JavaScript中调用Android方法
        webView.loadUrl("javascript:alert(jsBridge.callAndroid('World!'));");

三、 WebView的优化

1、减少不必要的加载

WebView默认会加载所有资源,包括图片、样式、脚本等,这样会导致加载速度变慢、消耗流量增加。因此,我们应该尽量减少不必要的加载。

可以通过以下两种方式实现:

(1)使用WebViewClient中的shouldInterceptRequest()方法截取资源请求,返回null则表示不加载该资源;

(2)使用WebSettings中的setBlockNetworkImage()方法禁止加载图片。

2、启用缓存

可以通过WebSettings中的setAppCacheEnabled()、setCacheMode()等方法来启用WebView缓存。例如,以下代码启用了应用缓存、开启DOM storage和启用LocalStorage:

    // 启用应用缓存
        webView.getSettings().setAppCacheEnabled(true);

        // 设置缓存模式
        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

        // 启用DOM storage
        webView.getSettings().setDomStorageEnabled(true);

        // 启用LocalStorage
        webView.getSettings().setDatabaseEnabled(true);
        webView.getSettings().setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath() + "/database/");

3、WebView的复用

WebView的创建和销毁是很耗费资源的操作,因此我们应该尽量避免创建和销毁WebView。可以通过在Activity中创建一个单例的WebView对象,然后在需要使用WebView的地方调用该对象即可。

以下是一个简单的例子,它在Activity中创建了一个单例的WebView对象,并提供了一个start方法用于加载指定的URL。

    public class WebViewManager {
        private static volatile WebViewManager instance;
        private WebView webView;

        private WebViewManager(Context context) {
            webView = new WebView(context);
            webView.setWebViewClient(new WebViewClient() {
                // ...
            });
        }

        public static WebViewManager getInstance(Context context) {
            if (instance == null) {
                synchronized (WebViewManager.class) {
                    if (instance == null) {
                        instance = new WebViewManager(context);
                    }
                }
            }
            return instance;
        }

        public void start(String url) {
            webView.loadUrl(url);
            // ...
        }

        // ...
    }

4、避免内存泄漏

由于WebView的使用场景很多,无论在哪个地方使用WebView,都有可能引发内存泄漏问题。

下面是一些WebView内存泄漏的常见情况:

(1)在Activity销毁时未销毁WebView;

(2)没有调用WebView.destroy()方法来释放WebView的资源;

(3)绑定了Activity的上下文,导致WebView在Activity销毁后仍保持了对该Activity的引用。

Android WebView的使用

2023-05-24
Android WebView详解

2023-05-17
Android WebView原理和用法详解

2023-05-14
提高网页流量的方法:Android WebView和Java

2023-05-17
js和webview,Js和webview交互

2022-11-23
印象笔记记录java学习(Java成长笔记)

2022-11-12
Android WebView:让原生应用也能浏览网页

一、什么是Android WebView WebView是Android系统自带的一个控件,它可以让我们在原生应用中嵌入Web页面,从而让我们的应用也能够浏览网页。 WebView不仅仅是一个可视化控

2023-12-08
Android WebView与JavaScript互动的实

一、WebView类及其内置函数 WebView是Android提供的一个可以用来展示网页的控件,能够很好地兼容各种网页,例如HTML5、js和CSS等。除了展示网页,WebView还可以和JavaS

2023-12-08
webview禁用js,webview禁用复制

2022-11-24
Android WebView加载本地HTML

2023-05-24
java方法整理笔记(java总结)

2022-11-08
安卓Webview全方位介绍

2023-05-18
webview交互js,webview html5

本文目录一览: 1、iOS下webView和JS交互 2、iOS中WkWebView与js交互 3、android中webview与js交互 iOS下webView和JS交互 下面说一下使用方法 申明

2023-12-08
android使用pdf.js,android使用的数据库

本文目录一览: 1、基于android如何读取pdf文件 2、android pdf如何实现发大后下一页 3、WebView做的浏览器,为什么使用pdf.js播放pdf文档时应用会崩溃 4、pdf.j

2023-12-08
提高Android WebView加载速度的技巧

2023-05-14
Android JSBridge实现原理和使用方法

一、什么是Android JSBridge Android JSBridge是一种可以实现Android应用与H5页面之间相互通信的桥梁技术。通过JSBridge,H5页面可以调用Android应用中

2023-12-08
webviewjs发请求(webview的网络请求)

本文目录一览: 1、WKWebView js方法的使用 2、webview 与js怎样实现数据交互 3、android中webview与js交互 4、UIWebView怎么拦截到网页里面JS发起的Aj

2023-12-08
webviewjs事件,webview 执行js

2022-11-25
android的js框架(android js引擎)

本文目录一览: 1、Android真的推荐用MVI模式?MVI和MVVM有什么区别? 2、在Android上怎样实现JAVA和JS交互 3、android 混合开发 用什么框架好 4、Android如

2023-12-08
Webview加载本地HTML的详细阐述

2023-05-19