一、WebView
在移动应用程序中用来显示网页内容的组件,相当于内嵌浏览器
1.Webkit
开源的网页浏览引擎,Chrome和Safari浏览器的渲染内核
-
WebKit Embedding API:浏览器UI与 WebKit 引擎进行交互的接口
-
WebCore:网页内容渲染
-
JSCore:解释和执行JS代码,实现动态网页内容的更新和交互
-
Platform API:与特定操作系统和平台进行通信和交互
2.WebView
主要作用:显示网页内容,提供了加载URL、生命周期管理、状态管理、调用JS代码等功能
常用方法:
-
加载网页:loadUrl(String url)
-
管理浏览历史:goBack()、goForward()控制页面回退和前进
-
获取辅助类:getSettings()、setWebViewClient(WebViewClient client)、setWebChromeClient(WebChromeClient client)
-
添加JS接口:addJavascriptInterface(Object object, String name)
-
执行JS代码:evaluateJavascript(String script, ValueCallback<String> resultCallback)
3.WebSettings
主要作用:配置和管理Webview
常用方法:
-
设置缓存模式:setCacheMode(int mode)
-
启用或禁用JS交互:setJavaScriptEnabled(boolean flag)
-
启用地理位置:setGeolocationEnabled(boolean flag);
4.WebViewClient
主要作用:处理通知、请求、加载错误等事件
常用方法:
5.WebChromeClient
主要作用:辅助WebView处理JS相关事件及浏览器UI元素变化
常用方法:
-
onProgressChanged(WebView view, int newProgress):页面加载进度发生变化时传递当前加载进度
-
onReceivedTitle(WebView view, String title):页面的标题发生变化时传递新的页面标题
-
onJsAlert(WebView view, String url, String message, JsResult result):传递 alert 提示框的信息和结果处理对象
-
onJsConfirm(WebView view, String url, String message, JsResult result):传递 confirm 确认框的信息和结果处理对象
-
onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):传递 prompt 输入框的信息、默认值和结果处理对象
二、JavaScriptBridge
将Native接口封装成JS接口,将JS接口封装成原生接口,构建Native和JS的双向通信通道
1.Android调用JS
2.JS调用Android
-
在Android代码中创建一个JavaScript接口类,使用@JavascriptInterface注解标记需要暴露给JS的方法,用于处理来自H5页面的调用请求
public class WebInterface {
private final Context context;
WebInterface(Context context) {
this.context = context;
}
@JavascriptInterface
public void showSnackbar(final String message) {
if (context != null) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
View rootView = ((Activity) context).findViewById(android.R.id.content);
Snackbar.make(rootView, message, Snackbar.LENGTH_SHORT).show();
}
});
}
}
}
-
在Activity中设置WebView,并使用addJavascriptInterface将Java对象暴露给JavaScript,给对象指定一个名称
webView.addJavascriptInterface(new WebInterface(this), "Android");
-
在H5页面中编写JavaScript代码,通过接口调用Android方法
<script>
function showAndroidSnackbar(message) {
// 通过WebView得到接口对象Android,调用注解标注的方法
Android.showSnackbar(message);
}
</script>
WebView内部会解析JavaScript调用,找到对应的Java对象和方法,并将JavaScript传递的参数转换为Java方法的参数,调用该方法