Bubblewrap构建TWA应用配置intent-filter跳转Activity闪退问题
问题原因
你配置的intent-filter基础语法没有错误,点击链接后应用直接终止是Bubblewrap构建TWA应用的特殊运行机制导致的:
- TWA的主入口是Bubblewrap自动注入的可信网页启动Activity,默认接管所有应用内导航事件。当Web内容点击非http/https的自定义scheme链接时,TWA的Chrome运行时会先尝试销毁当前TWA会话,再解析跳转目标。如果你的自定义Activity和TWA主Activity共用任务栈,销毁会话的操作会直接回收整个应用进程,表现为点击后应用直接关闭。
- TWA默认开启可信来源校验,没有加入白名单的自定义scheme导航会被运行时直接拦截触发崩溃。
- 如果你是直接修改构建输出目录下的AndroidManifest.xml,Bubblewrap每次构建都会重写该文件,你添加的Activity配置可能被覆盖,或是和自动生成的主Activity intent-filter产生冲突。
修复方案
按以下步骤调整即可:
- 在Bubblewrap项目根目录的
twa-manifest.json中添加自定义scheme白名单,同时声明自定义Activity,避免配置被构建流程覆盖:
- 在Bubblewrap项目根目录的
{ // 其余原有配置保持不变 "additionalTrustedOrigins": ["my-app://open-activity"], "activities": [ { "name": ".TestActivity", "exported": true } ] }
- 在源码目录下的自定义AndroidManifest.xml(注意是你自己维护的
app/src/main/AndroidManifest.xml,不是build输出目录下的自动生成文件)中,给TestActivity配置独立任务栈属性,避免和TWA主Activity共用栈导致进程被回收,完整配置如下:
- 在源码目录下的自定义AndroidManifest.xml(注意是你自己维护的
<activity android:name=".TestActivity" android:exported="true" android:taskAffinity="${applicationId}.testactivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="open-activity" android:scheme="my-app" /> </intent-filter> </activity>
Bubblewrap构建时会自动合并源码目录下的Manifest配置,不会被重写覆盖。
- 兼容Android 12及以上版本的intent解析规则,在TestActivity的
onCreate生命周期中添加异常兜底逻辑,避免非法intent触发崩溃:
- 兼容Android 12及以上版本的intent解析规则,在TestActivity的
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val targetUri = intent?.data if (targetUri != null && targetUri.scheme == "my-app" && targetUri.host == "open-activity") { // 在此处编写TestActivity的业务逻辑 } else { // 异常跳转兜底,直接返回应用主页面 val launchIntent = packageManager.getLaunchIntentForPackage(packageName) startActivity(launchIntent) finish() } }
- 清理之前的构建缓存,重新执行
bubblewrap build生成新的安装包,覆盖安装即可。
- 清理之前的构建缓存,重新执行
可以先通过adb命令验证清单配置是否生效,排除前端链接写法问题:
adb shell am start -a android.intent.action.VIEW -d "my-app://open-activity" 替换为你的应用包名
执行命令后如果能正常拉起TestActivity,说明原生配置已经生效,再回到Web页面点击链接测试即可。
内容的提问来源于stack exchange,提问作者Mohammad Zare
相关产品推荐
相关产品推荐

