一叹谁、簡(jiǎn)介
- WebView是Android系統(tǒng)中的原生控件,其主要功能與前端頁(yè)面進(jìn)行響應(yīng)交互刽沾,快捷省時(shí)地實(shí)現(xiàn)如期的功能,相當(dāng)于增強(qiáng)版的內(nèi)置瀏覽器排拷。
- 使用時(shí)需要在配置文件里設(shè)置網(wǎng)絡(luò)權(quán)限侧漓,定義布局大小和樣式,綁定和操作控件监氢。
manifest.xml
<uses-permission android:name="android.permission.INTERNET" />
activity_main.xml
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
MainActivity.java
String url = "https://www.baidu.com";
WebView webView = (WebView) findViewById(R.id.web_view);
webView.loadUrl(url);
- 網(wǎng)頁(yè)跳轉(zhuǎn)布蔗,包括前進(jìn)、后退浪腐、自定義纵揍。
boolean back = webview.canGoBack(); -> 判斷網(wǎng)頁(yè)是否可以回退
webview.goBack(); -> 回退一頁(yè)
boolean forward = webview.canGoForward(); -> 判斷網(wǎng)頁(yè)是否可以前進(jìn)
webview.goForward(); -> 前進(jìn)一頁(yè)
webview.goBackOrForward(1); -> 正數(shù)為前進(jìn)
webview.goBackOrForward(-1); -> 負(fù)數(shù)為后退
二、生命周期
- onResume():活躍狀態(tài)议街,可以正常執(zhí)行網(wǎng)頁(yè)的響應(yīng)泽谨。
- onPause():暫停狀態(tài),頁(yè)面被失去焦點(diǎn)特漩,暫停所有進(jìn)行中的動(dòng)作吧雹,如:DOM解析、CSS和JavaScript執(zhí)行等涂身。
- pauseTimers():全局WebView暫停狀態(tài)雄卷,如:layout、parsing蛤售、javascripttimer等丁鹉。
- resumeTimers():恢復(fù)到pauseTimers()執(zhí)行前的狀態(tài)。
- destroy():銷毀狀態(tài)悴能,釋放資源揣钦。
- 注意:使用WebView不當(dāng)容易引起內(nèi)存泄漏,所以WebView的生命周期方法應(yīng)跟隨Activity的生命周期的方法來(lái)調(diào)用漠酿。
三拂盯、 WebSettings
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); -> 是否開(kāi)啟JS支持
webSettings.setPluginsEnabled(true); -> 是否開(kāi)啟插件支持
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); -> 是否允許JS打開(kāi)新窗口
webSettings.setUseWideViewPort(true); -> 縮放至屏幕大小
webSettings.setLoadWithOverviewMode(true); -> 縮放至屏幕大小
webSettings.setSupportZoom(true); -> 是否支持縮放
webSettings.setBuiltInZoomControls(true); -> 是否支持縮放變焦,前提是支持縮放
webSettings.setDisplayZoomControls(false); -> 是否隱藏縮放控件
webSettings.setAllowFileAccess(true); -> 是否允許訪問(wèn)文件
webSettings.setDomStorageEnabled(true); -> 是否節(jié)點(diǎn)緩存
webSettings.setDatabaseEnabled(true); -> 是否數(shù)據(jù)緩存
webSettings.setAppCacheEnabled(true); -> 是否應(yīng)用緩存
webSettings.setAppCachePath(uri); -> 設(shè)置緩存路徑
webSettings.setMediaPlaybackRequiresUserGesture(false); -> 是否要手勢(shì)觸發(fā)媒體
webSettings.setStandardFontFamily("sans-serif"); -> 設(shè)置字體庫(kù)格式
webSettings.setFixedFontFamily("monospace"); -> 設(shè)置字體庫(kù)格式
webSettings.setSansSerifFontFamily("sans-serif"); -> 設(shè)置字體庫(kù)格式
webSettings.setSerifFontFamily("sans-serif"); -> 設(shè)置字體庫(kù)格式
webSettings.setCursiveFontFamily("cursive"); -> 設(shè)置字體庫(kù)格式
webSettings.setFantasyFontFamily("fantasy"); -> 設(shè)置字體庫(kù)格式
webSettings.setTextZoom(100); -> 設(shè)置文本縮放的百分比
webSettings.setMinimumFontSize(8); -> 設(shè)置文本字體的最小值(1~72)
webSettings.setDefaultFontSize(16); -> 設(shè)置文本字體默認(rèn)的大小
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); -> 按規(guī)則重新布局
webSettings.setLoadsImagesAutomatically(false); -> 是否自動(dòng)加載圖片
webSettings.setDefaultTextEncodingName("UTF-8"); -> 設(shè)置編碼格式
webSettings.setNeedInitialFocus(true); -> 是否需要獲取焦點(diǎn)
webSettings.setGeolocationEnabled(false); -> 設(shè)置開(kāi)啟定位功能
webSettings.setBlockNetworkLoads(false); -> 是否從網(wǎng)絡(luò)獲取資源
四记靡、WebViewClient
- 控件客戶端谈竿,用于處理各種通知和請(qǐng)求事件团驱。
- onPageStarted():頁(yè)面開(kāi)始加載時(shí)調(diào)用,這時(shí)候可以顯示加載進(jìn)度條空凸,讓用戶耐心等待頁(yè)面的加載嚎花。
- onPageFinished():頁(yè)面完成加載時(shí)調(diào)用,這時(shí)候可以隱藏加載進(jìn)度條呀洲,提醒用戶頁(yè)面已經(jīng)完成加載紊选。
- onLoadResource():頁(yè)面每次加載資源時(shí)調(diào)用。
- shouldOverrideUrlLoading():WebView加載url默認(rèn)會(huì)調(diào)用系統(tǒng)的瀏覽器道逗,通過(guò)重寫(xiě)該方法兵罢,實(shí)現(xiàn)在當(dāng)前應(yīng)用內(nèi)完成頁(yè)面加載。
- onReceivedError():頁(yè)面加載發(fā)生錯(cuò)誤時(shí)調(diào)用滓窍,這時(shí)候可以跳轉(zhuǎn)到自定義的錯(cuò)誤提醒頁(yè)面卖词,總比系統(tǒng)默認(rèn)的錯(cuò)誤頁(yè)面美觀,優(yōu)化用戶體驗(yàn)吏夯。
- onReceivedHttpError():頁(yè)面加載請(qǐng)求時(shí)發(fā)生錯(cuò)誤此蜈。
- onReceivedSslError():頁(yè)面加載資源時(shí)發(fā)生錯(cuò)誤。
- shouldOverrideKeyEvent():覆蓋按鍵默認(rèn)的響應(yīng)事件噪生,這時(shí)候可以根據(jù)自身的需求在點(diǎn)擊某些按鍵時(shí)加入相應(yīng)的邏輯裆赵。
- onScaleChanged():頁(yè)面的縮放比例發(fā)生變化時(shí)調(diào)用,這時(shí)候可以根據(jù)當(dāng)前的縮放比例來(lái)重新調(diào)整WebView中顯示的內(nèi)容跺嗽,如修改字體大小战授、圖片大小等。
- shouldInterceptRequest():可以根據(jù)請(qǐng)求攜帶的內(nèi)容來(lái)判斷是否需要攔截請(qǐng)求桨嫁。
WebViewClient webViewClient = new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
}
@Override
public boolean onLoadResource(WebView view, String url) {
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true; -> 消費(fèi)事件終止傳遞
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl){
view.loadUrl("file:///android_assets/error.html"); -> assets目錄下放置文件
}
webView.setWebViewClient(webViewClient);
五陈醒、WebChromeClient
- 瀏覽器客戶端,用于處理網(wǎng)站圖標(biāo)瞧甩、網(wǎng)站標(biāo)題钉跷、網(wǎng)站彈窗等。
- onProgressChanged():頁(yè)面加載進(jìn)度發(fā)生變化時(shí)調(diào)用肚逸,可以通過(guò)該方法實(shí)時(shí)向用戶反饋加載情況爷辙,如顯示進(jìn)度條等。
- onReceivedIcon():接收Web頁(yè)面的圖標(biāo)朦促,可以通過(guò)該方法把圖標(biāo)設(shè)置在原生的控件上膝晾,如Toolbar等。
- onReceivedTitle():接收Web頁(yè)面的標(biāo)題务冕,可以通過(guò)該方法把圖標(biāo)設(shè)置在原生的控件上血当,如Toolbar等。
- onJsAlert():處理JS的Alert對(duì)話框。
- onJsPrompt():處理JS的Prompt對(duì)話框臊旭。
- onJsConfirm():處理JS的Confirm對(duì)話框落恼。
- onPermissionRequest():Web頁(yè)面請(qǐng)求Android權(quán)限時(shí)調(diào)用。
- onPermissionRequestCanceled():Web頁(yè)面請(qǐng)求Android權(quán)限被取消時(shí)調(diào)用离熏。
- onShowFileChooser():Web頁(yè)面上傳文件時(shí)調(diào)用佳谦。
- getVideoLoadingProgressView():自定義媒體文件播放加載時(shí)的進(jìn)度條。
- getDefaultVideoPoster():設(shè)置媒體文件默認(rèn)的預(yù)覽圖钻蔑。
- onShowCustomView():媒體文件進(jìn)入全屏?xí)r調(diào)用奸鸯。
- onHideCustomView():媒體文件退出全屏?xí)r調(diào)用。
WebChromeClient webChromeClient = new WebChromeClient();
六窗怒、Android調(diào)用JS
- 語(yǔ)法:webView.loadUrl("javascript:method()");
- 在Web頁(yè)面中定義兩個(gè)Js方法钝满,分別是有返回值和無(wú)返回值申窘。
let name = '';
function setter(name){
this.name = name;
}
function getter(){
return this.name;
}
- 在Android中通過(guò)WebView調(diào)用Js方法
String setter = "javascript:setter('"+"wjx"+"');";
webView.loadUrl(setter); -> 調(diào)用有參無(wú)返回值的函數(shù)
webView.evaluateJavascript("getter()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) { -> 調(diào)用無(wú)參有返回值的函數(shù)
System.out.println("my name is "+s);
}
});
七剃法、Js調(diào)用Android
webView.addJavascriptInterface(this, "bridge"); -> 建立通訊橋梁
webView.removeJavascriptInterface("bridge"); -> 移除通訊橋梁
- 在Android中定義一個(gè)方法,標(biāo)記為Js接口
@JavascriptInterface
public void toast(String toast){
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
- 在Web頁(yè)面中調(diào)用Android方法
function toast(toast){
javascript:bridge.toast(toast); -> 通過(guò)橋梁調(diào)用方法
window.bridge.toast(toast); -> 通過(guò)橋梁調(diào)用方法
}