Android WebView

一叹谁、簡(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

  • 控件的相關(guān)配置
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)用方法
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贷洲,一起剝皮案震驚了整個(gè)濱河市收厨,隨后出現(xiàn)的幾起案子剂习,更是在濱河造成了極大的恐慌缤苫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿寂,死亡現(xiàn)場(chǎng)離奇詭異钦椭,居然都是意外死亡拧额,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門彪腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侥锦,“玉大人,你說(shuō)我怎么就攤上這事德挣」Э眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)番挺。 經(jīng)常有香客問(wèn)我唠帝,道長(zhǎng),這世上最難降的妖魔是什么建芙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任没隘,我火速辦了婚禮,結(jié)果婚禮上禁荸,老公的妹妹穿的比我還像新娘右蒲。我一直安慰自己,他們只是感情好赶熟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布间坐。 她就那樣靜靜地躺著竹宋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飒硅。 梳的紋絲不亂的頭發(fā)上三娩,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音会前,去河邊找鬼回官。 笑死笛坦,一個(gè)胖子當(dāng)著我的面吹牛版扩,可吹牛的內(nèi)容都是我干的礁芦。 我是一名探鬼主播柿扣,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼析桥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泡仗!你這毒婦竟也來(lái)了搔课?” 一聲冷哼從身側(cè)響起辣辫,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姐浮,失蹤者是張志新(化名)和其女友劉穎卖鲤,沒(méi)想到半個(gè)月后蛋逾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體偷拔,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺旧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了称龙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茵瀑。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸿捧,靈堂內(nèi)的尸體忽然破棺而出匙奴,到底是詐尸還是另有隱情泼菌,我是刑警寧澤哗伯,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布焊刹,位于F島的核電站,受9級(jí)特大地震影響贺奠,放射性物質(zhì)發(fā)生泄漏错忱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婚脱。 院中可真熱鬧障贸,春花似錦篮洁、人聲如沸袁波。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夭苗。三九已至题造,卻和暖如春晌梨,著一層夾襖步出監(jiān)牢的瞬間须妻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绰更, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人特恬。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像显拜,于是被迫代替她去往敵國(guó)和親远荠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子譬淳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354