前言:相信好多小伙伴跟我一樣,項(xiàng)目趕得急,用到混合開發(fā)的時(shí)候自然選擇webview網(wǎng)上隨便找一個(gè)用法就可以了,已加載看出來了東西,OK過了,可是當(dāng)你真正的要攔截URL做一些事情的時(shí)候,你發(fā)現(xiàn)網(wǎng)上說的并不正確。
一:寫代碼
WebSettings webSettings =webView.getSettings();
? ? //設(shè)置支持js方法
? ? webSettings.setJavaScriptEnabled(true);
? ? //支持自動(dòng)加載圖片
? ? webSettings.setLoadsImagesAutomatically(true);
? ? webSettings.setDomStorageEnabled(true);
? ? webSettings.setAllowFileAccess(true);
? ? webSettings.setAppCacheEnabled(true);
? ? //設(shè)置 緩存模式
? ? webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
? ? // 開啟 DOM storage API 功能
? ? webSettings.setDomStorageEnabled(true);
? ? webView.loadUrl(url);
? ? //覆蓋WebView默認(rèn)使用第三方或系統(tǒng)默認(rèn)瀏覽器打開網(wǎng)頁的行為,使網(wǎng)頁用WebView打開
? ? webView.setWebViewClient(new WebViewClient() {
@Override
? ? ? ? public boolean shouldOverrideUrlLoading(WebView view, String url) {
//返回值是true的時(shí)候控制去WebView打開,為false調(diào)用系統(tǒng)瀏覽器或第三方瀏覽器
? ? ? ? ? ? Share.d("shouldOverrideUrlLoading=" + url);
? ? ? ? ? ? if (url.contains(Path.WEBVIEW +"showMemberInfo?memberId=")) {
//對(duì)應(yīng)班級(jí)詳情
? ? ? ? ? ? ? ? String first = url.substring(url.indexOf("="));
? ? ? ? ? ? ? ? String second = first.replace("=", "");
? ? ? ? ? ? ? ? Share.d("classidfirst" + first);
? ? ? ? ? ? ? ? Share.d("classidsecond" + second);
? ? ? ? ? ? ? ? if (!ClassPathResource.isEmptyOrNull(second)) {
if (second.equals("spouse")) {
//配偶自動(dòng)生成的時(shí)候沒有id,沒有詳細(xì)信息跳轉(zhuǎn)添加頁面添加信息
? ? ? ? ? ? ? ? ? ? ? ? Bundle bundle =new Bundle();
? ? ? ? ? ? ? ? ? ? ? ? bundle.putString("type", "spouse");
? ? ? ? ? ? ? ? ? ? ? ? openActivity(AddFamilyActivity.class, bundle);
? ? ? ? ? ? ? ? ? ? }else {
//有id直接跳轉(zhuǎn)編輯頁面
? ? ? ? ? ? ? ? ? ? ? ? Bundle bundle =new Bundle();
? ? ? ? ? ? ? ? ? ? ? ? bundle.putString("id", second);
? ? ? ? ? ? ? ? ? ? ? ? openActivity(FamilyDetailActivity.class, bundle);
? ? ? ? ? ? ? ? ? ? }
}
return true;
? ? ? ? ? ? }else if (url.matches(Path.WEBVIEW +"login.jsp")) {
Share.d("fase=" + url);
return true;
? ? ? ? ? ? }else {
return false;
? ? ? ? ? ? ? ? //return super.shouldOverrideUrlLoading(view, url);
? ? ? ? ? ? }
}
@Override
? ? ? ? public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
? ? ? ? ? ? Share.d("onPageStarted=" + url);
? ? ? ? ? ? showLoading();
? ? ? ? }
@Override
? ? ? ? public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
? ? ? ? ? ? dismissLoading();
? ? ? ? }
});
}
/**
* Back鍵控制網(wǎng)頁后退
*
* @param
* @param
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode ==KEYCODE_BACK) &&webView.canGoBack()) {
//webView.goBack();
? ? ? ? finish();
return true;
? ? }
return super.onKeyDown(keyCode, event);
}
/**
* 在 Activity 銷毀( WebView )的時(shí)候,先讓 WebView 加載null內(nèi)容,然后移除 WebView,再銷毀 WebView,最后置空。
*
* @param
* @param
*/
@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();
? ? UMShareAPI.get(this).release();
}
說明:這是我的一個(gè)頁面使用的,關(guān)鍵點(diǎn)在于? ? webView.setWebViewClient(new WebViewClient() {重寫他的方法。今天重新認(rèn)識(shí)一下
onPageStarted:頁面最先加載的URL,然后就是在第一個(gè)URL上面點(diǎn)擊的時(shí)候先加載shouldOverrideUrlLoading,馬上進(jìn)去onPageStarted,onPageStarted是資源準(zhǔn)備好,要顯示了,shouldOverrideUrlLoading是正準(zhǔn)備加載的二級(jí)鏈接,還有一點(diǎn)就是按返回鍵的時(shí)候不會(huì)走shouldOverrideUrlLoading方法,而是onPageStarted方法,所以在重寫回退鍵webview.goback。
shouldOverrideUrlLoading:重點(diǎn),網(wǎng)上大多數(shù)是view.webview(url) return turn,要這樣寫不攔截?zé)o所謂,但是你攔截做邏輯就完蛋了,到底return true,fase是什么。
源碼:
仔細(xì)閱讀注釋部分,可以得知在一個(gè)新的鏈接即將被加載時(shí),會(huì)出現(xiàn)以下幾種情況:
如果沒有提供 WebViewClient 對(duì)象,則 WebView 會(huì)請(qǐng)求 Activity 管理者選擇合適的 URL 處理方式,一般情況就是啟動(dòng)瀏覽器來加載URL;
如果提供了 WebViewClient 對(duì)象且shouldOverrideUrlLoading 方法返回 true,則宿主應(yīng)用(意思應(yīng)該是自己的Android應(yīng)用)處理URL;
如果提供了 WebViewClient 對(duì)象且shouldOverrideUrlLoading 方法返回 false,則當(dāng)前 WebView 處理URL;
再結(jié)合 shouldOverrideUrlLoading 方法源碼就可以得出上面圖片中的結(jié)論,其實(shí)我們沒必要自定義 WebViewClient 并重寫其 shouldOverrideUrlLoading 方法,因?yàn)?WebViewClient 源碼中 shouldOverrideUrlLoading 方法已經(jīng)返回 false,也就是說只要你設(shè)置了 WebViewClient 就可以實(shí)現(xiàn)在WebView 中加載新的鏈接而不去調(diào)用瀏覽器加載。
如果重寫了;記住fase是當(dāng)前webview處理了,ture就是不處理在當(dāng)前webview.
1、 默認(rèn)返回:return super.shouldOverrideUrlLoading(view, url); 這個(gè)返回的方法會(huì)調(diào)用父類方法,也就是跳轉(zhuǎn)至手機(jī)瀏覽器,平時(shí)寫webview一般都在方法里面寫 webView.loadUrl(url); 然后把這個(gè)返回值改成下面的false。
2、返回: return true;? webview處理url是根據(jù)程序來執(zhí)行的。
3、返回: return false; webview處理url是在webview內(nèi)部執(zhí)行。
總結(jié):知道啥意思了嗎,就是說你重寫的那個(gè)方法如果寫了webView.loadUrl(url);不管你return啥都是在webview內(nèi)部處理了,如果不寫的話,fase在webview處理;?true;? webview處理url是根據(jù)程序來執(zhí)行的。