Android WebView

一、簡介

  • WebView是Android系統(tǒng)中的原生控件,其主要功能與前端頁面進行響應交互,快捷省時地實現如期的功能,相當于增強版的內置瀏覽器。
  • 使用時需要在配置文件里設置網絡權限,定義布局大小和樣式,綁定和操作控件。
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);
  • 網頁跳轉,包括前進、后退、自定義。
boolean back = webview.canGoBack(); -> 判斷網頁是否可以回退
webview.goBack(); -> 回退一頁

boolean forward = webview.canGoForward(); -> 判斷網頁是否可以前進
webview.goForward(); -> 前進一頁

webview.goBackOrForward(1); -> 正數為前進
webview.goBackOrForward(-1); -> 負數為后退

二、生命周期

  • onResume():活躍狀態(tài),可以正常執(zhí)行網頁的響應。
  • onPause():暫停狀態(tài),頁面被失去焦點,暫停所有進行中的動作,如:DOM解析、CSS和JavaScript執(zhí)行等。
  • pauseTimers():全局WebView暫停狀態(tài),如:layout、parsing、javascripttimer等。
  • resumeTimers():恢復到pauseTimers()執(zhí)行前的狀態(tài)。
  • destroy():銷毀狀態(tài),釋放資源。
  • 注意:使用WebView不當容易引起內存泄漏,所以WebView的生命周期方法應跟隨Activity的生命周期的方法來調用。

三、 WebSettings

  • 控件的相關配置
WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true); -> 是否開啟JS支持
webSettings.setPluginsEnabled(true); -> 是否開啟插件支持
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); -> 是否允許JS打開新窗口

webSettings.setUseWideViewPort(true); -> 縮放至屏幕大小
webSettings.setLoadWithOverviewMode(true); -> 縮放至屏幕大小
webSettings.setSupportZoom(true); -> 是否支持縮放
webSettings.setBuiltInZoomControls(true); -> 是否支持縮放變焦,前提是支持縮放
webSettings.setDisplayZoomControls(false); -> 是否隱藏縮放控件

webSettings.setAllowFileAccess(true); -> 是否允許訪問文件
webSettings.setDomStorageEnabled(true); -> 是否節(jié)點緩存
webSettings.setDatabaseEnabled(true); -> 是否數據緩存
webSettings.setAppCacheEnabled(true); -> 是否應用緩存
webSettings.setAppCachePath(uri); -> 設置緩存路徑

webSettings.setMediaPlaybackRequiresUserGesture(false); -> 是否要手勢觸發(fā)媒體
webSettings.setStandardFontFamily("sans-serif"); -> 設置字體庫格式
webSettings.setFixedFontFamily("monospace"); -> 設置字體庫格式
webSettings.setSansSerifFontFamily("sans-serif"); -> 設置字體庫格式
webSettings.setSerifFontFamily("sans-serif"); -> 設置字體庫格式
webSettings.setCursiveFontFamily("cursive"); -> 設置字體庫格式
webSettings.setFantasyFontFamily("fantasy"); -> 設置字體庫格式
webSettings.setTextZoom(100); -> 設置文本縮放的百分比
webSettings.setMinimumFontSize(8); -> 設置文本字體的最小值(1~72)
webSettings.setDefaultFontSize(16); -> 設置文本字體默認的大小

webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); -> 按規(guī)則重新布局
webSettings.setLoadsImagesAutomatically(false); -> 是否自動加載圖片
webSettings.setDefaultTextEncodingName("UTF-8"); -> 設置編碼格式
webSettings.setNeedInitialFocus(true); -> 是否需要獲取焦點
webSettings.setGeolocationEnabled(false); -> 設置開啟定位功能
webSettings.setBlockNetworkLoads(false); -> 是否從網絡獲取資源

四、WebViewClient

  • 控件客戶端,用于處理各種通知和請求事件。
  • onPageStarted():頁面開始加載時調用,這時候可以顯示加載進度條,讓用戶耐心等待頁面的加載。
  • onPageFinished():頁面完成加載時調用,這時候可以隱藏加載進度條,提醒用戶頁面已經完成加載。
  • onLoadResource():頁面每次加載資源時調用。
  • shouldOverrideUrlLoading():WebView加載url默認會調用系統(tǒng)的瀏覽器,通過重寫該方法,實現在當前應用內完成頁面加載。
  • onReceivedError():頁面加載發(fā)生錯誤時調用,這時候可以跳轉到自定義的錯誤提醒頁面,總比系統(tǒng)默認的錯誤頁面美觀,優(yōu)化用戶體驗。
  • onReceivedHttpError():頁面加載請求時發(fā)生錯誤。
  • onReceivedSslError():頁面加載資源時發(fā)生錯誤。
  • shouldOverrideKeyEvent():覆蓋按鍵默認的響應事件,這時候可以根據自身的需求在點擊某些按鍵時加入相應的邏輯。
  • onScaleChanged():頁面的縮放比例發(fā)生變化時調用,這時候可以根據當前的縮放比例來重新調整WebView中顯示的內容,如修改字體大小、圖片大小等。
  • shouldInterceptRequest():可以根據請求攜帶的內容來判斷是否需要攔截請求。
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; -> 消費事件終止傳遞
  }

  @Override
  public void onReceivedError(WebView view, int errorCode, 
    String description, String failingUrl){
    view.loadUrl("file:///android_assets/error.html"); -> assets目錄下放置文件
}

webView.setWebViewClient(webViewClient);

五、WebChromeClient

  • 瀏覽器客戶端,用于處理網站圖標、網站標題、網站彈窗等。
  • onProgressChanged():頁面加載進度發(fā)生變化時調用,可以通過該方法實時向用戶反饋加載情況,如顯示進度條等。
  • onReceivedIcon():接收Web頁面的圖標,可以通過該方法把圖標設置在原生的控件上,如Toolbar等。
  • onReceivedTitle():接收Web頁面的標題,可以通過該方法把圖標設置在原生的控件上,如Toolbar等。
  • onJsAlert():處理JS的Alert對話框。
  • onJsPrompt():處理JS的Prompt對話框。
  • onJsConfirm():處理JS的Confirm對話框。
  • onPermissionRequest():Web頁面請求Android權限時調用。
  • onPermissionRequestCanceled():Web頁面請求Android權限被取消時調用。
  • onShowFileChooser():Web頁面上傳文件時調用。
  • getVideoLoadingProgressView():自定義媒體文件播放加載時的進度條。
  • getDefaultVideoPoster():設置媒體文件默認的預覽圖。
  • onShowCustomView():媒體文件進入全屏時調用。
  • onHideCustomView():媒體文件退出全屏時調用。
WebChromeClient webChromeClient = new WebChromeClient();

六、Android調用JS

  • 語法:webView.loadUrl("javascript:method()");
  • 在Web頁面中定義兩個Js方法,分別是有返回值和無返回值。
let name = '';

function setter(name){
    this.name = name;
}

function getter(){
    return this.name;
}
  • 在Android中通過WebView調用Js方法
String setter = "javascript:setter('"+"wjx"+"');";
webView.loadUrl(setter); -> 調用有參無返回值的函數

webView.evaluateJavascript("getter()", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) { -> 調用無參有返回值的函數
        System.out.println("my name is "+s);
    }
});

七、Js調用Android

webView.addJavascriptInterface(this, "bridge");  -> 建立通訊橋梁
webView.removeJavascriptInterface("bridge"); -> 移除通訊橋梁
  • 在Android中定義一個方法,標記為Js接口
@JavascriptInterface
public void toast(String toast){
  Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
  • 在Web頁面中調用Android方法
function toast(toast){
  javascript:bridge.toast(toast); -> 通過橋梁調用方法
  window.bridge.toast(toast); -> 通過橋梁調用方法
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容