為什么要學(xué)習(xí)與H5互調(diào)?
微信,QQ空間等大量軟件都內(nèi)嵌了H5,不得不說是一種趨勢。與H5互調(diào)可以讓我們的實現(xiàn)混合開發(fā),至于混合開發(fā)就是在一個App中內(nèi)嵌一個輕量級的瀏覽器,一部分原生的功能改為Html 5來開發(fā)。
優(yōu)勢:使用H5實現(xiàn)的功能能夠在不升級App的情況下動態(tài)更新,而且可以在或iOS的App上同時運行,節(jié)約了成本,提高了開發(fā)效率。
原理:其實就是Java代碼和之間的調(diào)用。
開局插入一張文章的目錄結(jié)構(gòu):
簡介
要實現(xiàn)與H5互調(diào),是一個很重要的控件,可以很好地幫助我們展示html頁面,所以有必要先了解一下。
一丶常用方法
//加載assets目錄下的test.html文件 webView.loadUrl("file:///android_asset/test.html"); //加載網(wǎng)絡(luò)資源(注意要加上網(wǎng)絡(luò)權(quán)限) webView.loadUrl("http://blog.csdn.net");
實現(xiàn)對網(wǎng)頁中超鏈接的攔截(比如如果是極客導(dǎo)航的主頁,則直接攔截轉(zhuǎn)到百度主頁): 當點擊頁面中的鏈接后,會在加載URL前回調(diào)ding( view, url)方法,一般點擊一個鏈接此方法調(diào)用一次。
webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if("http://www.jikedaohang.com/".equals(url)) { view.loadUrl("https://www.baidu.com/"); } return true; } });
關(guān)于ding返回值的誤區(qū):網(wǎng)上很多解釋是 true代表在本中打開鏈接, false代表調(diào)用系統(tǒng)瀏覽器打開鏈接。其實只要設(shè)置了,則就不會調(diào)用系統(tǒng)瀏覽器。 那么ding的返回值到底代表什么呢? true,則在打開新的url時就不會再加載這個url了,所有處理都需要在中操作,包含加載; false,則系統(tǒng)就認為上層沒有做處理,接下來還是會繼續(xù)加載這個url的;默認 false。具體的區(qū)別展示如下: 加載百度主頁,設(shè)置后,重寫ding( view, url)方法,第一張是返回false的截圖(點擊后正常跳轉(zhuǎn)),第二章是返回true的截圖(點擊無反應(yīng),如果希望能夠跳轉(zhuǎn),則需要我們自己進行處理):
還有一點需要注意的是,如果我們攔截了某個url,那么 false 和 true區(qū)別不大,所以一般建議 false。加載網(wǎng)頁時替換某個資源(比如在加載一個網(wǎng)頁時,需要加載一個logo圖片,而我們想要替換這個logo圖片,用我們目錄下的一張圖片替代) 我們知道我們在加載一個網(wǎng)頁的同時也會加載js,css,圖片等資源,所以會多次調(diào)用st方法,我們可以在st中進行圖片替換。 注意:st有兩個重載: ① st ( view, url) 【已過時】 ② st ( view, ) 這兩種方法主要是第二個參數(shù)的不同, 將能夠獲取更多的信息,提供了(),,等方法。這里主要是為了展示效果,使用了第一種回調(diào)方法。實現(xiàn)方法如下:
mWebView.setWebViewClient(new WebViewClient(){ @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = null; if (url.contains("logo")) { try { InputStream logo = getAssets().open("logo.png"); response = new WebResourceResponse("image/png", "UTF-8", logo); } catch (IOException e) { e.printStackTrace(); } } return response; } });
設(shè)置開始加載網(wǎng)頁、加載完成、加載錯誤時處理
webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // 開始加載網(wǎng)頁時處理 如:顯示"加載提示" 的加載對話框 ... } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 網(wǎng)頁加載完成時處理 如:讓 加載對話框 消失 ... } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); // 加載網(wǎng)頁失敗時處理 如:提示失敗,或顯示新的界面 ... } });
處理https請求,為處理ssl證書設(shè)置默認是不處理https請求的access數(shù)據(jù)庫參數(shù)查詢,需要在子類中重寫父類的函數(shù)
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // 接受信任所有網(wǎng)站的證書 // handler.cancel(); // 默認操作 不處理 // handler.handleMessage(null); // 可做其他處理 } });
顯示頁面加載進度在子類中重寫父類的函數(shù),表示當前頁面加載的進度,為1至100的整數(shù)
webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { setTitle("頁面加載中,請稍候..." + progress + "%"); setProgress(progress * 100); if (progress == 100) { //... } } });
加快HTML網(wǎng)頁加載完成速度(默認情況html代碼下載到后,開始解析網(wǎng)頁各個節(jié)點,發(fā)現(xiàn)有外部樣式文件或者外部腳本文件時,會異步發(fā)起網(wǎng)絡(luò)請求下載文件,但如果在這之前也有解析到image節(jié)點,那勢必也會發(fā)起網(wǎng)絡(luò)請求下載相應(yīng)的圖片。在網(wǎng)絡(luò)情況較差的情況下access數(shù)據(jù)庫參數(shù)查詢,過多的網(wǎng)絡(luò)請求就會造成帶寬緊張,影響到css或js文件加載完成的時間,造成頁面空白過久。解決的方法就是告訴先不要自動加載圖片,等頁面后再發(fā)起圖片加載。)
//1.首先在WebView初始化時添加如下代碼 if(Build.VERSION.SDK_INT >= 19) { /*對系統(tǒng)API在19以上的版本作了兼容。因為4.4以上系統(tǒng)在onPageFinished時再恢復(fù)圖片加載時,如果存在多張圖片引用的是相同的src時,會只有一個image標簽得到加載,因而對于這樣的系統(tǒng)我們就先直接加載。*/ webView.getSettings().setLoadsImagesAutomatically(true); } else { webView.getSettings().setLoadsImagesAutomatically(false); } //2.在WebView的WebViewClient子類中重寫onPageFinished()方法添加如下代碼: @Override public void onPageFinished(WebView view, String url) { if(!webView.getSettings().getLoadsImagesAutomatically()) { webView.getSettings().setLoadsImagesAutomatically(true); } }
創(chuàng)建
class MyDownloadListenter implements DownloadListener{ @Override public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype, long contentLength) { //下載任務(wù)...,主要有兩種方式 //(1)自定義下載任務(wù) //(2)調(diào)用系統(tǒng)的download的模塊 Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }
給加入監(jiān)聽
webview.setDownloadListener(new MyDownloadListenter());
public boolean onKeyDown(int keyCode, KeyEvent event) { //其中webView.canGoBack()在webView含有一個可后退的瀏覽記錄時返回true if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } return super.onKeyDown(keyCode, event); } }
二丶配置
獲取對象
= .();
常用設(shè)置方法(1)支持js
.(true);
(2)設(shè)置緩存方式,主要有以下幾種: : 不使用網(wǎng)絡(luò),只讀取本地緩存數(shù)據(jù)。 : 根據(jù)cache-決定是否從網(wǎng)絡(luò)上取數(shù)據(jù)。 : API level 17中已經(jīng)廢棄, 從API level 11開始作用同模式。 : 不使用緩存,只從網(wǎng)絡(luò)獲取數(shù)據(jù)。 ORK:只要本地有,無論是否過期,或者no-cache,都使用緩存中的數(shù)據(jù)。
.(.);
(3)開啟DOM API功能(HTML5 提供的一種標準的接口,主要將鍵值對存儲在本地,在頁面加載完畢后可以通過 來操作這些數(shù)據(jù)。)
.(true);
(4)設(shè)置數(shù)據(jù)庫緩存路徑
.();
(5)設(shè)置 緩存目錄
.();
(6)設(shè)置默認編碼
.(“utf-8”);
(7)將圖片調(diào)整到適合的大小
.(false);
(8)支持縮放
.(true);
(9)支持內(nèi)容重新布局
.(..);
(10)多窗口
.ws();
(11)設(shè)置可以訪問文件
.(true);
(12)當調(diào)用時為設(shè)置節(jié)點
.(true);
(13)設(shè)置支持縮放
.ls(true);
(14)支持通過JS打開新窗口
.(true);
(15)縮放至屏幕的大小
.ode(true);
(16)支持自動加載圖片
.(true);
三丶 的回調(diào)方法列表
主要用來輔助處理各種通知、請求等事件,通過方法設(shè)置。
(1)更新歷史記錄
ry( view, url, )
(2)應(yīng)用程序重新請求網(wǎng)頁數(shù)據(jù)
( view, , )
(3)在加載頁面資源時會調(diào)用,每一個資源(比如圖片)的加載都會調(diào)用一次。
( view, url)
(4)開始載入頁面調(diào)用,通常我們可以在這設(shè)定一個的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。
( view, url, )
(5)在頁面加載結(jié)束時調(diào)用。同樣道理,我們知道一個頁面載入完成,于是我們可以關(guān)閉 條,切換程序動作。
( view, url)
(6)報告錯誤信息
( view, int , , )
(7)獲取返回信息授權(quán)請求