使用CustomTabsIntent启动webview后如何显示AlertDialog弹窗
CustomTabsIntent 页面加载完成后弹出AlertDialog实现方案
首先明确核心问题:CustomTabsIntent依赖外部浏览器实现页面渲染,本身没有暴露精细的页面加载生命周期接口,你之前遇到的两个问题对应根因如下:
launchUrl是异步调用,执行时仅向浏览器发送加载请求,不会等待页面加载完成,所以直接在后续弹框会提前弹出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
相关产品推荐
相关产品推荐

