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

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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 =  new LinearLayout.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();      }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄