webview網(wǎng)上的大多數(shù)正確嗎

前言:相信好多小伙伴跟我一樣,項(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í)行的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ips 由于WebView的用法實(shí)在太多,如果您只是想查詢某個(gè)功能的使用——建議Ctrl+F(Commad+F)在...
    LouisLau_6d51閱讀 1,451評(píng)論 0 12
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,295評(píng)論 0 17
  • 參考 WebView在現(xiàn)在的項(xiàng)目中使用的頻率應(yīng)該還是非常高的。 WebSettingsWebSettings we...
    蘇未_閱讀 5,216評(píng)論 2 8
  • 怎樣抽取一個(gè)常用的WebView基類 在開發(fā)中我們會(huì)經(jīng)常用到網(wǎng)頁加載,但是如果每次出現(xiàn)一個(gè)需要加載頁面的需求時(shí),就...
    安卓小生閱讀 1,764評(píng)論 1 8
  • 生活,就是歲月如流,磕磕絆絆中,不斷出現(xiàn)問題解決問題的過程。 人生的每一次選擇都會(huì)有代價(jià)。有時(shí)候,解決一個(gè)老問題會(huì)...
    薔薇季閱讀 222評(píng)論 2 1

友情鏈接更多精彩內(nèi)容