从Android 4.4开始,Android中的WebView不再是基于WebKit的,而是开始基于Chromium,这个改变 使得WebView的性能大幅提升,并且对HTML5,CSS,JavaScript有了更好的支持!
注意事项:
1.如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。 所以,当你的程序中需要用到多线程时候,也请使用runOnUiThread()方法来保证你关于 WebView的操作是在UI线程中进行的。
runOnUiThread(newRunnable(){ @Override publicvoid run(){ // Code for WebView goes here } });
2. evaluateJavascript() 就是专门来异步执行JavaScript代码的。
mWebView.evaluateJavascript(script, new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //TODO } });
3.只有添加 @JavascriptInterface 声明的Java方法才可以被JavaScript调用。
------------加载url---------------------
设置加载网络的权限:<uses-permission android:name=
"android.permission.INTERNET"
data-filtered=
"filtered"
></uses-permission>
webView = (WebView) findViewById(R.id.main_webview);
webView.loadUrl("https://www.baidu.com/");这样加载的网页会跳转到手机浏览器,如果想要网页显示在当前Activity中,需要设置其浏览器模式为false;如下:
webView = (WebView) findViewById(R.id.main_webview);
// 设置WebView的客户端,让网页显示在当前Activity中。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;// 返回false
}
});
webView.loadUrl("https://www.baidu.com/");
加载本地html:在main文件夹下创建assets文件夹(右键new -》Foloder->assets folder);
webView.loadUrl("file:///android_asset/demo.html");//file:///andriod_asset是固定写法。
WebView还提供了一个抽象类WebSettings来设置其所显示网页的一些基本内容,
WebSettings webSettings = webView.getSettings();
// 让WebView能够执行javaScript
webSettings.setJavaScriptEnabled(true);
// 让JavaScript可以自动打开windows
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 设置缓存
webSettings.setAppCacheEnabled(true);
// 设置缓存模式,一共有四种模式
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 设置缓存路径
// webSettings.setAppCachePath("");
// 支持缩放(适配到当前屏幕)
webSettings.setSupportZoom(true);
// 将图片调整到合适的大小
webSettings.setUseWideViewPort(true);
// 支持内容重新布局,一共有四种方式
// 默认的是NARROW_COLUMNS
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
// 设置可以被显示的屏幕控制
webSettings.setDisplayZoomControls(true);
// 设置默认字体大小
webSettings.setDefaultFontSize(12);
----------------加载html字符串---------------
设置一下默认的字符编码,Android中普遍使用UTF-8
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("UTF-8");
之后调用WebView的loadData方法
String body="这里面是html字符串";
webView.loadData(body, "text/html; charset=UTF-8", null);
-------JS调用andriod----
demo.html
<html> <head> <title>Js调用Android</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <input type="button" value="Toast提示" οnclick=" myObj.showToast('js调用安卓');"/> <input type="button" value="列表对话框" οnclick="myObj.showDialog();"/> </body> </html>
创建一个类,这个类的对象是用来暴露给JS的。
public class MyObject {
private Context context;
public MyObject(Context context) {
this.context = context;
}
@android.webkit.JavascriptInterface
//将显示Toast和对话框的方法暴露给JS脚本调用
public void showToast(String name) {
Log.d("js调用安卓","成功");
System.out.println("调用安卓成功");
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
@android.webkit.JavascriptInterface
public void showDialog() {
new AlertDialog.Builder(context)
.setTitle("联系人列表").setIcon(R.mipmap.wyj)
.setItems(new String[]{"一", "二", "三", "四", "五"}, null)
.setPositiveButton("确定", null).create().show();
}
}
加载网页,建立js和安卓对象的联系
@SuppressLint("JavascriptInterface")
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
webView = (WebView) view.findViewById(R.id.webview);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;// 返回false
}
});
webView.loadUrl("file:///android_asset/demo.html");
WebSettings webSettings = webView.getSettings();
//①设置WebView允许调用js
webSettings.setJavaScriptEnabled(true);
webSettings.setDefaultTextEncodingName("UTF-8");
//②将object对象暴露给Js,调用addjavascriptInterface
webView.addJavascriptInterface(new MyObject(getContext()), "myObj");
}
setWebClient就是帮助WebView处理各种通知、请求事件
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
setWebChromeClient辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
-----webview文件下载----
WebView作为一个浏览器般的组件, 当然也是支持下载,我们可以自己来写下载的流程,设置下载后的文件放哪,以什么文件名 保存,当然也可以调用其它内置的浏览器来进行下载,比如Chrome,UC等等。我们只需为WebView设置setDownloadListener,然后重写DownloadListener的 onDownloadStart,然后在里面写个Intent,然后startActivity对应的Activity即可!
wView.setDownloadListener(new DownloadListener(){ @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Log.e("HEHE","开始下载"); Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } });
------webview缓存-----
所谓的页面缓存 就是指:保存加载一个网页时所需的HTML,JS,CSS等页面相关的数据以及其他资源,当没网的时候或者 网络状态较差的时候,加载本地保存好的相关数据!而实现这个缓存的方式有两种,一种是后台写一个 下载的Service,将文章相关的数据按自己的需求下载到数据库或者保存到相应文件夹中,然后下次加载 对应URL前先判断是否存在本地缓存,如果存在优先加载本地缓存,不存在则执行联网请求,同时缓存 相关资源。一种是通过WebView本身自带的缓存功能来缓存页面,这种方式使用起来非常 简单,我们只需为WebView设置开启相关功能,以及设置数据库的缓存路径即可完成缓存
-------第三方的webview框架----
腾讯x5webview:jar包下载地址:https://x5.tencent.com/tbs/sdk.html
<!--腾讯X5Webview所需权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />