• Android webview 写入cookie的解决方法以及一些属性设置


    原文地址:https://www.2cto.com/kf/201703/616868.html

    Android webview 写入cookie的解决方法以及一些属性设置,webview怎么设置写入Cookie的问题,项目中正好APP和网页交互中要用到免登录,因为在网上搜索了很多种方法,看到一个解决问题了,现在记录分享下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void setCookie() {
           String StringCookie = "key=" + value + ";path=/"
           CookieManager cookieManager = CookieManager.getInstance();
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
               cookieManager.removeSessionCookies(null);
               cookieManager.flush();
           else {
               cookieManager.removeSessionCookie();
               CookieSyncManager.getInstance().sync();
           }
           cookieManager.setAcceptCookie(true);
           cookieManager.setCookie(url, StringCookie);
       }

    以上代码在webview设置属性、webview.loadUrl之前调用就可以了

    webview设置的一些属性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //声明WebSettings子类
    WebSettings webSettings = webView.getSettings();
     
     //支持javascript
    webSettings.setJavaScriptEnabled(true);
     
    //设置自适应屏幕,两者合用
    webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
    webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
     
    //缩放操作
    webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
    webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
    webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
     
    //设置WebView缓存
    //优先使用缓存:
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    //缓存模式如下:
    //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
    //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
    //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
    //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
     
    //不使用缓存:
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    关于前进 / 后退网页:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //是否可以后退
    Webview.canGoBack()
    //后退网页
    Webview.goBack()
    //是否可以前进                    
    Webview.canGoForward()
    //前进网页
    Webview.goForward()
     
    //以当前的index为起始点前进或者后退到历史记录中指定的steps
    //如果steps为负数则为后退,正数则为前进
    Webview.goBackOrForward(intsteps)

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

    在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身 目标:点击返回后,是网页回退而不是推出浏览器 解决方案:在当前Activity中处理并消费掉该 Back 事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KEYCODE_BACK) && Webview.canGoBack()) {
            Webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    //或者下面这种
       @Override
    public void onBackPressed() {
      if (webView.canGoBack()) {
              webView.goBack();
              return;
         }
            super.onBackPressed();
     }

    注意事项:如何避免WebView内存泄露?

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

    1
    2
    3
    4
    LinearLayout.LayoutParams params = newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            webView= new WebView(getApplicationContext());
            webView.setLayoutParams(params);
            mLayout.addView(webView);

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override
        protected void onDestroy() {
            if (webView!= null) {
                webView.loadDataWithBaseURL(null"""text/html""utf-8"null);
                webView.clearHistory();
     
                ((ViewGroup) webView.getParent()).removeView(webView);
                webView.destroy();
                webView= null;
            }
            super.onDestroy();
        }
  • 相关阅读:
    Docker系列【使用docker搭建fastdfs并使用SpringBoot实现文件上传下载】
    Docker系列【使用docker搭建文件单机存储服务器minio】
    Docker系列【查看Latest的镜像具体版本和查看容器用到的镜像版本】
    Docker系列【DockerDesktop的安装和使用】
    SpringBoot系列【如何自定义Starter】
    Redis系列【分布式锁解决方案之Redisson】
    c++实训课
    链队列的实现(上课用)
    循环队列(上课用)
    AE基础01 视频添加水印
  • 原文地址:https://www.cnblogs.com/yelanggu/p/10870285.html
Copyright © 2020-2023  润新知