Android WebView(一) 基本使用
2016-05-10 20:12
393 查看
使用WebView通常是需要网络的,所以需要加上访问网络的权限
加载某个url的方法
需要注意的是不要省略前面的
加载assets中的HTML
加载一段javascript
为js提供本地方法
注意:
提供给javascript的方法必需是
提供给javascript的方法将会在WebView管理的线程中执行,因此要保证该方法的线程安全性.(Toast是支持在非UI线程中show()的,所以上面的
提供给javascript的方法一定要加上
在Android 4.2,Api 17之前,javascript可以通过反射java对象,来执行一些危险操作.比如反射取到Runtime,然后执行shell命令
虽然
针对Android 4.2以前的设备,我们建议不要通过
页面跳转
访问历史回退
在Logcat中输出javascript的日志信息
支持javascript的警告框
支持javascript的确认框
支持javascript提问框
显示空白页
清除返回栈
获得访问历史列表
下载
resumeTimers, onResume 恢复解析,javascript执行等操作.区别是 onResume 只作用于调用它的WebView,而 resumeTimers 作用于当前应用中所有的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 作用于当前应用中所有的WebViewresumeTimers, onResume 恢复解析,javascript执行等操作.区别是 onResume 只作用于调用它的WebView,而 resumeTimers 作用于当前应用中所有的WebView
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享