WebView使用相关笔记(一)

简介: 一、WebView常用的方法:1、加载url // 1、加载一个网页 wvDeviceInfo.loadUrl("https://www.

一、WebView常用的方法:

1、加载url

 //        1、加载一个网页
       wvDeviceInfo.loadUrl("https://www.baidu.com/");
       //        2、加载apk内部的html界面
       wvDeviceInfo.loadUrl("file:///android_asset/First.html");
       //        3、加载手机本地的界面
       wvDeviceInfo.loadUrl("content://com.android.htmlfileprovider/sdcard/First.html");

       // 方式4: 加载 HTML 页面的一小段内容
       WebView.loadData(data, mimeType, encoding)
       // 参数1:需要截取展示的内容
       // 内容里不能出现 ’#’, ‘%’, ‘\’ , ‘?’ 这四个字符,若出现了需用 %23, %25, %27, %3f 对应来替代,否则会出现异常
       // 参数2:展示内容的类型
       // 参数3:字节码
       wvDeviceInfo.getUrl();//获取当前url

2、webView状态

 wvDeviceInfo.onResume();
//1、激活webView为活动状态,执行网页的响应; 2、一般在onResume方法内执行

 wvDeviceInfo.onPause();
//1、webView为暂停状态,节省资源,减少cpu功耗;2、在看不见当前界面的时候执行,例如:activity内的onPause方法内执行;
// 3、全局方法

 wvDeviceInfo.pauseTimers();
//1、暂停layout、parsing、JavaScript Timer;程序进入后台时调用,降低功耗

 wvDeviceInfo.resumeTimers();
//恢复所有的pauseTimers暂停的操作

3、网页返回

 wvDeviceInfo.canGoBack();//1、判断是否可以返回到历史记录;2、通过该方法判断点击返回键是返回到webView的上一页还是退出当前界面

        wvDeviceInfo.goBack();//回退网页

        wvDeviceInfo.canGoForward();//是否可以在历史记录内前进

        wvDeviceInfo.goForward();//前进网页

        int page = 0;

        wvDeviceInfo.goBackOrForward(page);//前进或者后退,整数表示前进,负数表示后退

4、关于退出webView

 wvDeviceInfo.clearCache(true);//清除缓存。true表示清除全局缓存,包括本地的缓存;false表示删除内存内的缓存,不删除磁盘内缓存

wvDeviceInfo.clearHistory();//清除访问历史

 ((ViewGroup)wvDeviceInfo.getParent()).removeView(wvDeviceInfo);
        
wvDeviceInfo.destroy();//销毁webView。一定要在父容器内remove掉webView之后调用;

二、WebSetting相关方法

1、加载显示方面

 wvDeviceInfo.getSettings().setJavaScriptEnabled(true);
        //设置webView支持js;可以加载执行动画等
        //在onResume中开启设置为true;在onPause中设置false,节省资源

wvDeviceInfo.getSettings().setAllowContentAccess(true);
        //配置是否可以访问文件数据

wvDeviceInfo.getSettings().setBlockNetworkImage(false);
        //是否允许webView加载图片数据,如果设置不允许,之后设置允许,则需要刷新之后才会出现图片

wvDeviceInfo.getSettings().setUseWideViewPort(true);
      //将图片调整到适合webView的大小

wvDeviceInfo.getSettings().setLoadWithOverviewMode(true);
      // 缩放至屏幕的大小

wvDeviceInfo.getSettings().setBuiltInZoomControls(true);
        //是否支持缩放操作

wvDeviceInfo.getSettings().setDisplayZoomControls(true);
        //是否显示缩放按钮

wvDeviceInfo.getSettings().setSupportMultipleWindows(true);
        //是否支持多窗口模式

wvDeviceInfo.getSettings().setNeedInitialFocus(true);
        //设置webView是否需要设置一个节点获取焦点,默认true;

wvDeviceInfo.getSettings().setAppCacheEnabled(true);
        //是否启用应用缓存

2、缓存相关的

wvDeviceInfo.getSettings().setAppCacheEnabled(true);
        //是否启用应用缓存

        String path = "";

wvDeviceInfo.getSettings().setAppCachePath(path);
        //配置缓存路径,只可以被调用一次,多次被忽视

wvDeviceInfo.getSettings().setAppCacheMaxSize(1024);
        //设置缓存最大值
        

wvDeviceInfo.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
        //设置缓存模式
        //WebSettings.LOAD_DEFAULT:默认模式在网页前进或者是后退缓存没有过期的情况下优先使用缓存
        //WebSettings.LOAD_CACHE_ELSE_NETWORK:只要缓存可以用就加载缓存,不管是否过期
        //WebSettings.LOAD_NO_CACHE:不加载缓存,只从网络加载数据
        //WebSettings.LOAD_CACHE_ONLY:只加载网络数据,不加载缓存

        //有网的时候使用 WebSettings.LOAD_DEFAULT;没网的时候使用WebSettings.LOAD_CACHE_ONLY

wvDeviceInfo.getSettings().setDatabaseEnabled(true);
        //是否启用数据库缓存

String arent="";
wvDeviceInfo.getSettings().setUserAgentString(arent);
        //设置用户代理

wvDeviceInfo.getSettings().setDefaultTextEncodingName("UTF-8");
        //设置编码格式

三、WebViewClient相关方法

1、应用内置界面打开网页,不调用手机的浏览器方法shouldOverrideUrlLoading()

    //应用内部默认打开url
    
        //应用内部默认打开 url、
        wvDeviceInfo.setWebViewClient(new WebViewClient() {
      //适用于 android 7.0 以下系统
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        //适用于 android 7.0 以上版本
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                String url = request.getUrl().toString();
                view.loadUrl(url);
                return true;
            }
        });

2、配置刚刚打开界面时的加载动画

  wvDeviceInfo.setWebViewClient(new WebViewClient(){
            //配置一个加载动画,告诉用户,界面正在加载
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                //配置加载动画
            }
            //关闭加载动画,告诉用户,加载完成
            @Override
            public void onPageFinished(WebView view, String url) {
               //记载配置加载完成
            }
        });

3、加载每一个资源都会回调的方法

  wvDeviceInfo.setWebViewClient(new WebViewClient() {
            @Override
            public void onLoadResource(WebView view, String url) {
                // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
            }
        });

4、处理https请求


        wvDeviceInfo.setWebViewClient(new WebViewClient() {
            //处理https加载错误情况
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();//等待证书相应
                //                handler.handleMessage(new Message());//做其他处理
            }

        });

        // 特别注意:5.0以后默认禁止了https和http混用,以下方式是开启
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            wvDeviceInfo.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
            //改成MIXED_CONTENT_COMPATIBILITY_MODE也可以的,但是不建议使用
        }

5、webView内处理按键事件

 wvDeviceInfo.setWebViewClient(new WebViewClient() {
            //处理return true时表示可以在webView内处理按键事件
            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return true;
            }
        });

6、webView内的范围发生变化时产生回调

wvDeviceInfo.setWebViewClient(new WebViewClient() {
            //当webView内的范围值发送变化时,回调
            @Override
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                super.onScaleChanged(view, oldScale, newScale);
            }
        });

7、处理web加载或服务器返回的错误码

   wvDeviceInfo.setWebViewClient(new WebViewClient() {
            //处理web加载时错误,但是不处理服务器返回的错误码
            //界面上每一个请求都会返回,所以谨慎调用
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            //处理web加载返回的错误码
            //界面上每一个请求都会返回,所以谨慎调用
            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                super.onReceivedHttpError(view, request, errorResponse);
            }
        });

四、WebChromeClient的相关方法

处理js相关的操作

1、显示网页加载进度的方法


        wvDeviceInfo.setWebChromeClient(new WebChromeClient() {
            //网页加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    String progress = newProgress + "%";
                    tvTitleName.setText(progress);
                }
            }
        });

2、获取网页标题

     wvDeviceInfo.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                //获取web的标题
                tvTitleName.setText(title);
            }
        });

3、支持js的提示框

   wvDeviceInfo.setWebChromeClient(new WebChromeClient() {
            //支持js的警告框
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                new AlertDialog.Builder(WebDeviceInfoActivity.this)
                        .setTitle("警告框")
                        .setMessage(message)
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        })
                        .setCancelable(false)
                        .show();
                return true;
            }

            //支持js的确认框
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
                new AlertDialog.Builder(WebDeviceInfoActivity.this)
                        .setTitle("确认框")
                        .setMessage(message)
                        .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        })
                        .setCancelable(false)
                        .show();
                return true;
            }

            //支持js的输入框
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
                final EditText et = new EditText(WebDeviceInfoActivity.this);
                et.setText(defaultValue);
                new AlertDialog.Builder(WebDeviceInfoActivity.this)
                        .setTitle(message)
                        .setView(et)
                        .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm(et.getText().toString());
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        })
                        .setCancelable(false)
                        .show();
                return true;
            }
        });

4、支持文件上传请求

   wvDeviceInfo.setWebChromeClient(new WebChromeClient() {
            //支持文件上传请求
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
 FileChooserParams fileChooserParams) {

                return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
            }
        });

5、支持权限相关操作

      wvDeviceInfo.setWebChromeClient(new WebChromeClient() {
            //请求某个尚未被允许或拒绝的权限时回调;
            @Override
            public void onPermissionRequest(PermissionRequest request) {
                super.onPermissionRequest(request);
            }
            //权限被取消的回调
            @Override
            public void onPermissionRequestCanceled(PermissionRequest request) {
                super.onPermissionRequestCanceled(request);
            }
        });

五、webView关于内存泄漏的相关处理

在onDestroy方法内书写如下代码

  //销毁 放置内存泄漏
    @Override
    protected void onDestroy() {
        wvDeviceInfo.clearCache(true);//删除缓存----全局删除

        if (wvDeviceInfo != null) {
            wvDeviceInfo.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            wvDeviceInfo.clearHistory();
            ((ViewGroup) wvDeviceInfo.getParent()).removeView(wvDeviceInfo);
            wvDeviceInfo.destroy();
            wvDeviceInfo = null;
        }
        super.onDestroy();
    }

注:

本文根据以下文章改编:
Android:这是一份全面 & 详细的Webview使用攻略
Android WebView 详解

相关文章
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
515 0
鸿蒙-webview的使用和JS交互(附源码)
|
6月前
|
缓存 JavaScript 前端开发
WebView完全解读
WebView完全解读
257 0
|
6月前
|
JavaScript 前端开发 安全
webview使用
webview使用
91 0
|
JavaScript 前端开发 Android开发
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
|
Android开发 前端开发
Android开发之WebView
感觉在显示信息时,用途还可以的。 只是不知和React Native的应用场合有何分别?
1691 0
|
缓存 JavaScript Android开发
WebView使用相关笔记(一)
一、WebView常用的方法: 1、加载url // 1、加载一个网页 wvDeviceInfo.loadUrl("https://www.
1004 0
|
JavaScript 前端开发 Android开发
|
Web App开发 Android开发
Android开发小技巧之不再使用原生的WebView了
前言 先来说说Android官方的WebView的版本差异,在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit作为内核,而在Android 4.4及其以上Google 采用了chromium作为内核,虽然是API上面没有什么变化,但是却非常的坑开发者。
1323 0