您的位置:首页 > 移动开发

Android WebView(一) 基本使用

2016-05-10 20:12 393 查看
使用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的方法必需是
public
的,否则js无法访问

提供给javascript的方法将会在WebView管理的线程中执行,因此要保证该方法的线程安全性.(Toast是支持在非UI线程中show()的,所以上面的
showToast
方法是没问题的)

提供给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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息