Browser:用 Custom Tabs 打开网页 · AndroidX 源码指南
AAndroidX 源码指南
Web 与外部内容
Web 与外部内容 · androidx.browser

Browser:用 Custom Tabs 打开网页Browser 1.11.0-alpha01

CustomTabsIntent、会话预热、CustomTabsCallback 与 AuthTab 的完整用法。

最后更新 2026-08-01

复制即用:最小启动

val intent = CustomTabsIntent.Builder()
    .setToolbarColor(color)
    .setColorScheme(CustomTabsIntent.COLOR_SCHEME_SYSTEM)
    .build()
intent.launchUrl(context, Uri.parse("https://example.com"))

androidx.browser 不做应用内渲染——把页面委托给系统浏览器进程,用 Custom Tabs 让体验接近应用内页面。

会话与预热(减少冷启动)

直接 launchUrl 每次冷启动浏览器进程。绑定服务 + 预热:

// 1. 探测可用浏览器
String packageName = CustomTabsClient.getPackageName(context, null);

// 2. 绑定服务
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
        client.warmup(0L);   // 预热进程
        CustomTabsSession session = client.newSession(null);
        // 之后的 launchUrl 复用预热进程
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}
};
CustomTabsClient.bindCustomTabsService(context, packageName, connection);

预热价值:后续 launchUrl 复用已预热进程,减少白屏。

会话的回调

CustomTabsSession session = client.newSession(new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, Bundle extras) {
        // 导航开始/完成/失败
    }

    @Override
    public void onRelationshipValidationResult(int relation, Uri origin, boolean result, Bundle extras) {
        // 域名关系校验(TWA 用)
    }
});

AuthTab:OAuth 专用页签

AuthTabIntent intent = new AuthTabIntent.Builder()
    .setScheme("https")
    .setHost("example.com")
    .build();
intent.launch(context, Uri.parse("https://example.com/oauth/authorize?..."));
  • 把 OAuth 流程限定在可信页签内(独立于普通浏览会话)。
  • 回跳的 token 交换仍由你的网络层完成——androidx.browser 不管认证状态。

Custom Tabs 变体

API用途
CustomTabsIntent基本页签(工具栏颜色、动画、关闭按钮)
CustomTabsSession会话 + 预热 + 消息
AuthTabIntentOAuth 专用页签
CustomTabsClient.getPackageName探测支持浏览器

常见陷阱

  • 不探测浏览器:设备无支持浏览器时无效果。
  • 每次冷启动:不用会话预热,白屏明显。
  • OAuth 用普通页签:会话混用,安全边界模糊。
  • token 交换放客户端:回跳后要服务端换 token。

复制即用

class BrowserHelper {
    fun openInCustomTab(context: Context, url: String) {
        val builder = CustomTabsIntent.Builder()
            .setShowTitle(true)
            .setColorScheme(CustomTabsIntent.COLOR_SCHEME_SYSTEM)
        builder.build().launchUrl(context, Uri.parse(url))
    }
}

要点

  • CustomTabsIntent 配置页签;会话预热减少冷启动。
  • CustomTabsCallback 接收导航事件;AuthTab 管 OAuth。
  • 渲染在系统浏览器,不做应用内 WebView。
  • token 交换由服务端完成。

相关页面