• Android混合开发之WebView使用总结


    前言:

         今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。

    混合开发相关博客:

    使用场景:

     1.)添加权限
    <uses-permission android:name="android.permission.INTERNET" />  
     2.)布局文件
     <WebView
       android:id="@+id/webView"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />
     3.)数据加载

     加载本地资源

    webView.loadUrl("file:///android_asset/example.html");

     加载网络资源

    webView.loadUrl("www.xxx.com/index.html");

     添加请求头信息

    Map<String,String> map=new HashMap<String,String>();
    map.put(
    "User-Agent","Android"); webView.loadUrl("www.xxx.com/index.html",map);

    也可以加载html片段

     String data = " Html 数据";
     webView.loadData(data, "text/html", "utf-8");

    实测会发现loadData会导致中文乱码,所以一般情况使用如下代码

    String data = " Html 数据";
    webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);
    4.)支持JavaScript

         比如项目总js触发一个native函数关闭Activity

        设置支持JavaScript

     WebSettings webSettings = webView.getSettings();
     webSettings.setJavaScriptEnabled(true);//设置支持javascript
     webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
     JavaScriptInterface 接口定义
        public class JavaScriptInterface {
            @android.webkit.JavascriptInterface
            public void doTrainFinish() {
               finish();
            }
        }
    5.)设置WebViewClient 主要辅助WebView处理各种通知、请求事件

    比如要实现WebView中链接在WebView内部跳转 

       webView.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });

    除此之外WebViewClient更多的处理网页的地址的解析和渲染,例如

          onLoadResource//加载资源时响应
      onPageStart//在加载页面时响应
      onPageFinish//在加载页面结束时响应
      onReceiveError//在加载出错时响应
      onReceivedHttpAuthRequest//获取返回信息授权请求

      6.)设置WebChromeClient主要辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

       比如加载进度获取title

            webView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                    if (newProgress == 100) {
                        //网页加载完成
                    } else {
                        //网页加载中
                    }
                }
            });

    除了上面检测进度之外还有

      onCloseWindow//关闭WebView
      onCreateWindow() //触发创建一个新的窗口
      onJsAlert //触发弹出一个对话框
      onJsPrompt //触发弹出一个提示
      onJsConfirm//触发弹出确认提示
      onProgressChanged //加载进度
      onReceivedIcon //获取网页icon
      onReceivedTitle//获取网页title

     7.)设置网页栈返回

        webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (webView.canGoBack()) {
                    webView.goBack();//返回上一浏览页面
                    return true;
                } else {
                    finish();//关闭Activity
                }
            }
            return super.onKeyDown(keyCode, event);
        }
    8.)WebView 缓存控制
    • LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
    • LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
    • LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
    • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
    • LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
    WebSettings webSettings = webView.getSettings();
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  
    9.)WebView屏幕自适应
     WebSettings webSettings = webView.getSettings();
     webSettings.setUseWideViewPort(true);
     webSettings.setLoadWithOverviewMode(true);
     10.)其他不常用设置
      WebSettings webSettings = webView.getSettings();
      webSettings.setSupportZoom(true);  //支持缩放
      webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
      webSettings.supportMultipleWindows();  //多窗口
      webSettings.setAllowFileAccess(true);  //设置可以访问文件
      webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
      webSettings.setBuiltInZoomControls(true); //设置支持缩放
      webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
      webSettings.setLoadsImagesAutomatically(true);  //支持自动加载图片
    11.)知识扩展WebViewJSBridge

    虽然谷歌也提供了js与native函数互相调用的方式,但是通过addjavascriptInterface这种方式在Android 4.2以下版本存在一定的安全隐患,在Android 4.2以上也需要加@JavascriptInterface注解,否则无法调用。基于上面的原因建议学习一下

    WebViewJSBridge这个比较不错的开源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge

    12.)硬件加速

     开启硬件加速强制使用GPU渲染,确实给app流畅度带来不小的提升,但是在使用过程中遇见webview闪烁,也有导致加载webView黑屏或者白屏

    解决办法:关闭硬件加速

     webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

     这是把webview 中的硬件加速关闭。设置LAYER_TYPE_SOFTWARE后会把当前view转为bitmap保存。这样就不能开多个webview,否则会报out of memory。

    需要在在webview中加入如下代码

        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            invalidate();
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

      

  • 相关阅读:
    spring security几大核心组件
    什么是CSRF攻击?如何避免?
    MyBatis+Oracle实现主键自增长的几种常用方式
    fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题
    Layui我提交表单时,table.reload(),表格会请求2次,是为什么?
    Jquery+ajax模板
    HttpServletRequest和ServletRequest的区别
    java技术基础
    mysql数据库基础
    linux基础03
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5645025.html
Copyright © 2020-2023  润新知