可以做哪些事情?
-
加载线上 url
mWebView.loadUrl("https://www.baidu.com");
-
加载本地 html
-
和 js 进行交互
-
js调用原生 App
public class TestJSEvent { @JavascriptInterface // 4.2以上必须加此注解,否则不生效 public void showToast(String toast) { Toast.makeText(WebViewActivity.this, toast, Toast.LENGTH_SHORT).show(); } } // js调用原生 App mWebView.addJavascriptInterface(new TestJSEvent(), "TestApp");
-
原生 App调用 js
mWebView.loadUrl("javascript:javaCallJS('可以传参数')");
-
-
历史记录
WebBackForwardList webBackForwardList = mWebView.copyBackForwardList(); WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(0); String historyUrl = historyItem.getUrl();
-
导航
@Override public void onBackPressed() { // 页面回退,而不直接关闭 Activity if (mWebView != null && mWebView.canGoBack()) { mWebView.goBack(); // 回退 // mWebView.goForward(); // 前进 // mWebView.goBackOrForward(+1); // 回退或前进。steps: 负为回退,正为前进 // mWebView.reload(); // 刷新 } else { super.onBackPressed(); } }
如何使用?
-
申请网络权限
<!-- 声明使用网络的权限 --> <uses-permission android:name="android.permission.INTERNET"/>
-
类结构
-
常用设置
-
WebSettings
// 打开 JavaScript mWebView.getSettings().setJavaScriptEnabled(true);
-
WebViewClient
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 是否重新加载(拦截页面) return super.shouldOverrideUrlLoading(view, url); } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // 页面开始加载 super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { // 页面结束 super.onPageFinished(view, url); } @Override public void onLoadResource(WebView view, String url) { // 加载资源 super.onLoadResource(view, url); } @Override public void onPageCommitVisible(WebView view, String url) { super.onPageCommitVisible(view, url); } @Nullable @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // 拦截请求 return super.shouldInterceptRequest(view, request); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 加载失败时 super.onReceivedError(view, errorCode, description, failingUrl); } });
方法太多了,这里看几个比较常用的
-
WebChromeClient
mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // 获取网页加载的进度 super.onProgressChanged(view, newProgress); } @Override public void onReceivedTitle(WebView view, String title) { // 获取网页的标题 super.onReceivedTitle(view, title); } @Override public void onCloseWindow(WebView window) { // 关闭窗口 super.onCloseWindow(window); } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { // js加载的时候 return super.onJsPrompt(view, url, message, defaultValue, result); } @Override public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) { // js导入的时候 return super.onJsBeforeUnload(view, url, message, result); } @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { // 位置权限 super.onGeolocationPermissionsShowPrompt(origin, callback); } });
方法太多了,这里看几个比较常用的
-
更深入的使用
-
Cookie
CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.setCookie("domain", "cookie"); cookieManager.removeAllCookies();
-
History
WebBackForwardList webBackForwardList = mWebView.copyBackForwardList(); WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(0); String historyUrl = historyItem.getUrl();
-
页面导航
-
Hybird
Hybrid App(混合模式移动应用)是指介于 Web App(套壳)、Native App(原生)这两者之间的 App ,兼具“ Native App 良好用户交互体验的优势 ”和“ Web App 跨平台开发的优势 ”。
-
如何拦截网络请求
@Nullable @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // 拦截请求 return super.shouldInterceptRequest(view, request); }
-
如何显示进度
@Override public void onProgressChanged(WebView view, int newProgress) { // 获取网页加载的进度 super.onProgressChanged(view, newProgress); }
-
调试
WebView.setWebContentsDebuggingEnabled(true);