Web 与外部内容
Web 与外部内容 · androidx.browser
WebKit:给旧平台带回新 WebView 能力Browser 1.11.0-alpha01
WebViewFeature 特性探测、WebViewCompat、多 Profile、投机加载与消息通信。
最后更新 2026-08-01
复制即用:特性探测
if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_ENABLE)) {
WebViewCompat.startSafeBrowsing(context, callback);
}androidx.webkit 不提供渲染引擎,把较新的 android.webkit 能力以静态方法带回旧平台。核心:WebViewCompat(静态方法)+ WebViewFeature(特性常量 + 探测)。
特性探测是使用前提
if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE)) {
// 才调用 Profile 相关 API
}常见特性:VISUAL_STATE_CALLBACK、OFF_SCREEN_PRERASTER、SAFE_BROWSING_ENABLE、WEB_MESSAGE_LISTENER、MULTI_PROFILE、SERVICE_WORKER_BASIC_USAGE。
必须逐个探测再调用——跳过探测在低版本 WebView 上没效果或直接失败。
应用内消息通信
// 创建通道
WebMessagePortCompat[] ports = WebViewCompat.createWebMessageChannel(webView);
WebMessagePortCompat pagePort = ports[0];
WebMessagePortCompat appPort = ports[1];
// 应用侧接收
appPort.setWebMessageCallback(new WebMessagePortCompat.WebMessageCallbackCompat() {
@Override
public void onMessage(WebMessagePortCompat port, WebMessageCompat message) {
String data = message.getData();
// 处理页面发来的消息
}
});
// 发给页面(把 pagePort 暴露给页面 JS)
WebViewCompat.postWebMessage(webView, new WebMessageCompat("hello"), Uri.parse("*"));页面侧 JS:
// 页面通过 WebMessageChannel 接收
window.channel.onmessage = (event) => {
// event.data
};多 Profile
if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE)) {
ProfileStore store = ProfileStore.getInstance();
Profile profile = store.getOrCreateProfile("work-profile");
WebView webView = profile.createWebView(context);
// 该 WebView 使用独立存储(cookies、cache)
}- 多 Profile 允许不同存储空间。
- 为多用户场景设计(工作/个人分离);单页面应用一般用不到。
投机加载(Prefetch/Prerender)
if (WebViewFeature.isFeatureSupported(WebViewFeature.PREFETCH_SUPPORT)) {
PrefetchParameters params = new PrefetchParameters.Builder(
Uri.parse("https://example.com/page")
).build();
PrefetchCache.prefetch(params, executor, callback);
}提前预取页面,进入时更快。受设备和网络条件影响。
常见陷阱
- 不探测直接用:低版本静默失败。
- 消息端口泄漏:通道用完要关闭端口。
- 多 Profile 未探测:不支持设备崩溃。
- WebView 渲染仍靠系统:WebKit 只是兼容层。
- 混淆删除 compat 类:ProGuard 保留
androidx.webkit类。
复制即用
public class WebContainer {
public static void setup(WebView webView, WebViewClient client) {
webView.setWebViewClient(client);
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER)) {
webView.addWebMessageListener("androidBridge", null,
new WebMessageListener() {
@Override
public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
// 页面调用 androidBridge.postMessage(...)
}
});
}
}
}要点
WebViewFeature.isFeatureSupported是起点;特性逐个探测。- WebViewCompat 提供 createWebMessageChannel / postWebMessage / startSafeBrowsing 等。
- 多 Profile、投机加载为高级场景;单页应用用不到。
- WebKit 是兼容层,渲染靠系统 WebView。