一、webView基本用法
- 样品工具库:kirikaTowa/AndroidUtils: Common tool library (github.com)
- 分支:develop_web_view
一、 基本使用:WebView全面解析
1、基本方法
- loadUrl()方法:传入需要展示的网页。
- getSettings():可以设置一些浏览器的属性。
- setJavaScriptEnabled():让WebV iew 支持JavaScript 脚本。
- setWebViewClient():传入了一个WebV iewClient 的实例,控制网页跳转时由当前WebView显示,而不是打开系统浏览器。
- CacheMode:灵活点的话可以根据当前是否有网络判断使用的策略。
- LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据;
- LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据;
- LOAD_NO_CACHE: 不使用缓存,只从网络获取数据;
- LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
- loadWithOverviewMode:超出屏幕宽度时自适应屏幕。
- domStorageEnabled:DOM storage API 功能,使LocalStorage生效。
- useWideViewPort:设置true则支持页面viewport属性标签。
- loadsImagesAutomatically:false为取消图片加载
- webSetting.blockNetworkImage = true :阻塞图片加载
- 作用:刚开始时加快项目速度,等onPageFinished后再开始加载图片;参考:神操作 之 远程调试 WebView 定位加载缓慢的坑 10.Webview.clearCache(true); 清除浏览网页留下的缓存;由于内核缓存是全局的因此webview而是针对整个应用。
- Webview.clearHistory();清除当前webview访问的历史记录;
- Webview.clearFormData();仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
2、 声明权限
<uses-permission android:name="android.permission.INTERNET" />
3、 初级样例代码【仓库里不是这样的】
- 代码
class MainActivity : AppCompatActivity() {
private var webView:WebView ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView = findViewById<View>(R.id.web_view) as WebView
webView!!.settings.javaScriptEnabled = true//支持h5
//webView!!.webViewClient = WebViewClient()//APP内部new一个Client来进行WebView预览
webView!!.loadUrl("https://www.baidu.com")
//webView!!.webViewClient=WebViewClient()
//url发生重定向处理
webView!!.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (url == null) {
return false
}
if (url.startsWith("weixin://") || url.startsWith("alipays://") || url.startsWith("tel://")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)
return true
}
if (url.startsWith("http://") || url.startsWith("https://")){
view?.loadUrl(url)
}else{
//非http和https文件的使用这个
val intent =Intent(Intent.ACTION_VIEW,Uri.parse(view?.url))
this@MainActivity.startActivity(intent)
}
return super.shouldOverrideUrlLoading(view, url)
}
}
}
//监听按键返回
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && webView?.canGoBack() == true) {
webView!!.goBack()
return true
}
return super.onKeyDown(keyCode, event)
}
override fun onDestroy() {
super.onDestroy()
//清除网页访问留下的缓存
//由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
webView?.clearCache(true)
//清除当前webview访问的历史记录
//只会webview访问历史记录里的所有记录除了当前访问记录
webView?.clearHistory()
//这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
webView?.clearFormData()
}
}
- 对应xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
- 加载方式
//方式一:加载一个网页
webView.loadUrl("http://www.baidu.com");
//方式二:加载应用资源文件内的网页
webView.loadUrl("file:///android_asset/test.html");
//方式三:加载一段代码
webView.loadData(String data,String mimeType, String encoding);
- 浏览器的前进与后退
- 点击系统返回键时,是结束当前的Activity,而非调用WebView的
goBack()
//WebView是否可以后退
boolean canGoBack = webView.canGoBack();
//WebView后退
webView.goBack();
//WebView是否可以前进
boolean canGoForward = webView.canGoForward();
//WebView前进
webView.goForward();
//以当前的index为起始点前进或者后退到历史记录中指定的steps
//如果steps为负数则为后退,正数则为前进
boolean canGoBackOrForward = webView.canGoBackOrForward(step);
其他感谢与参考文章
1、基础知识
- WebView控件之WebSettings详解
- localStorage使用总结
- 细说localStorage, sessionStorage, Cookie, Session ) 2、接入内核【俩都是基于Chrome的】
- 腾讯的
- 英特尔的,已停止维护,官网都没了