Android WebView(一) 基本使用

  • 使用WebView一般是須要網絡的,因此須要加上訪問網絡的權限
    <uses-permission android:name="android.permission.INTERNET" />
  • 加載某個url的方法
    WebView.loadUrl("http://www.baidu.com");
    須要注意的是不要省略前面的http://,省略的話,某些ROM中的WebView會加載失敗
  • 加載assets中的HTML
    WebView.loadUrl("file:///android_asset/xxx.html")
  • 加載一段javascript
    WebView.loadUrl("javascript:" + ${js_code})
  • 爲js提供本地方法
以下,提供一個showToast的方法給javascript
private static class JavaJs {
    private Context context;
    JavaJs(Context context) {
        this.context = context;
    }
    @JavascriptInterface
    public void showToast(String str) {
        Toast.makeText(context, str, Toast.LENGTH_LONG).show();
    }
}
webView.addJavascriptInterface(new JavaJs(this), "JavaJs");


<script type="text/javascript">
	JavaJs.showToast("toast from js");
</script>

注意:javascript

  1. 提供給javascript的方法必需是public的,不然js沒法訪問
  2. 提供給javascript的方法將會在WebView管理的線程中執行,所以要保證該方法的線程安全性.(Toast是支持在非UI線程中show()的,因此上面的showToast方法是沒問題的)
  3. 提供給javascript的方法必定要加上 @JavascriptInterface
    • 在Android 4.2,Api 17以前,javascript能夠經過反射java對象,來執行一些危險操做.好比反射取到Runtime,而後執行shell命令
    • 雖然@JavascriptInterface是在Api 17加上的,可是Api 17以前,咱們依然建議將提供給javascript的方法加上該annotation.(JSR-175規定,運行時annotation缺失,則直接忽略,而不會拋出ClassNotFoundException)
    • 針對Android 4.2之前的設備,咱們建議不要經過addJavascriptInterface向javascript提供方法,而且經過removeJavascriptInterface("searchBoxJavaBridge_")來移除WebView本身添加的java對象.
  • 頁面跳轉
webView.setWebViewClient(new WebViewClient() {
	@Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.xxx.com")) {
            // 本身的頁面,直接使用WebView加載
            return false;
        }
        // 別的公司的頁面,使用瀏覽器打開
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
});
  • 訪問歷史回退
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
        webView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
  • 在Logcat中輸出javascript的日誌信息
重寫WebChromeClient中的onConsoleMessage方法

@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
    Log.d("WebView", consoleMessage.message() + "  js line: " + consoleMessage.lineNumber());
    return true;
}
  • 支持javascript的警告框 alert
重寫WebChromeClient中的onJsAlert方法

@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
    new AlertDialog.Builder(MainActivity.this)
            .setTitle("JsAlert")
            .setMessage(message)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            })
            .setCancelable(false)
            .show();
    return true;
}
  • 支持javascript的確認框 confirm
重寫WebChromeClient中的onJsConfirm方法

@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
    new AlertDialog.Builder(MainActivity.this)
            .setTitle("JsConfirm")
            .setMessage(message)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.cancel();
                }
            })
            .setCancelable(false)
            .show();
    return true;
}
  • 支持javascript提問框 prompt
重寫WebChromeClient中的onJsPrompt方法

@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
    final EditText et = new EditText(MainActivity.this);
    et.setText(defaultValue);
    new AlertDialog.Builder(MainActivity.this)
            .setTitle(message)
            .setView(et)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm(et.getText().toString());
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.cancel();
                }
            })
            .setCancelable(false)
            .show();
    return true;
}
  • 顯示空白頁
WebView.loadUrl("about:blank");
//該方法使得WebView只會繪製一個白色背景,而且釋放以前加載頁面時使用的資源,並中止以前javascript的執行
  • 清除返回棧 WebView.clearHistory
  • 得到訪問歷史列表 WebView.copyBackForwardList
  • 下載 WebView.setDownloadListener

pauseTimers, onPause, resumeTimers, onResume

  • pauseTimers, onPause 中止解析,javascript執行等操做.區別是 onPause 只做用於調用它的WebView,而 pauseTimers 做用於當前應用中全部的WebView
  • resumeTimers, onResume 恢復解析,javascript執行等操做.區別是 onResume 只做用於調用它的WebView,而 resumeTimers 做用於當前應用中全部的WebView
相關文章
相關標籤/搜索