You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CustomTabsIntent启动webview后如何显示AlertDialog弹窗

CustomTabsIntent 页面加载完成后弹出AlertDialog实现方案

首先明确核心问题:CustomTabsIntent依赖外部浏览器实现页面渲染,本身没有暴露精细的页面加载生命周期接口,你之前遇到的两个问题对应根因如下:

  1. launchUrl是异步调用,执行时仅向浏览器发送加载请求,不会等待页面加载完成,所以直接在后续弹框会提前弹出
  2. onNavigationEvent未触发的核心原因是你未正确绑定CustomTabsService、创建带回调的CustomTabsSession,只有绑定服务后生成的Session关联的Intent才能收到导航回调

实现步骤

1. 引入依赖并绑定CustomTabsService

首先在模块级build.gradle添加browser依赖:

dependencies {
    implementation "androidx.browser:browser:1.6.0"
}

在启动CustomTabs的Activity中初始化服务绑定:

private var customTabsClient: CustomTabsClient? = null
private val serviceConnection = object : ServiceConnection {
    override fun onServiceConnected(componentName: ComponentName, service: IBinder) {
        customTabsClient = CustomTabsClient.wrapService(service)
        // 预热浏览器,提升加载速度
        customTabsClient?.warmup(0)
    }

    override fun onServiceDisconnected(componentName: ComponentName) {
        customTabsClient = null
    }
}

// 在onCreate生命周期中执行绑定,这里以Chrome为例,也可以遍历支持CustomTabs的浏览器包名
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    CustomTabsClient.bindCustomTabsService(this, "com.android.chrome", serviceConnection)
}

2. 创建带导航回调的CustomTabsIntent

通过绑定服务生成的CustomTabsClient创建带回调的Session,监听导航完成事件:

private fun launchCustomTab(url: String) {
    customTabsClient?.let { client ->
        // 注册导航回调
        val tabsCallback = object : CustomTabsCallback() {
            override fun onNavigationEvent(navigationEvent: Int, extras: Bundle?) {
                super.onNavigationEvent(navigationEvent, extras)
                // 导航完成事件对应页面加载完成
                if (navigationEvent == NAVIGATION_FINISHED) {
                    // 回调运行在Binder线程,必须切到主线程弹框
                    runOnUiThread {
                        AlertDialog.Builder(this@YourActivity)
                            .setTitle("提示")
                            .setMessage("页面已加载完成")
                            .setPositiveButton("确认", null)
                            .show()
                    }
                }
            }
        }
        // 生成带回调的Session
        val session = client.newSession(tabsCallback)
        // 构建Intent启动页面
        CustomTabsIntent.Builder(session)
            .build()
            .launchUrl(this, Uri.parse(url))
    }
}

3. 兼容异常场景

部分小众浏览器不支持CustomTabsService回调,可添加兜底逻辑:设置2s左右的延时弹框,标记弹窗是否已经通过回调弹出,避免重复触发。

注意事项

  • 仅支持Chrome等实现了CustomTabs标准协议的浏览器,系统WebView、无CustomTabs能力的浏览器无法收到导航回调
  • 所有UI操作必须切换到主线程执行,否则会触发线程异常崩溃
  • 不要依赖onNavigationEvent做强业务校验,部分浏览器可能存在回调延迟或者漏回调的情况

内容的提问来源于stack exchange,提问作者Alertomiant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:42:01