原文地址: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 =
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();
}
|