Jetpack Compose点击深层链接通知后Activity反复销毁问题求助
问题解决:Jetpack Compose深层链接通知跳转后Activity反复销毁重建
核心问题
点击深层链接通知成功跳转至ChatScreen,但MainScreensActivity持续触发onStart -> onStop -> onDestroy生命周期循环,导致Activity反复重建。
可能的原因与解决方案
1. 修正Intent Filter的冲突配置
Manifest中两个intent-filter混合了多个scheme和host规则,可能导致系统匹配深层链接时出现歧义,触发重复Intent分发。拆分独立规则:
<activity android:name=".presentation.ui.main_screens_activity.ui.MainScreensActivity" android:exported="false" android:label="@string/title_activity_main_screens" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.Chatalyze" tools:ignore="AppLinkUrlError" android:launchMode="singleTask"> <!-- 用singleTask确保栈顶唯一 --> <!-- scheme_chatalyze 相关链接 --> <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:scheme="scheme_chatalyze" android:host="call_screen" /> <data android:scheme="scheme_chatalyze" android:host="calls_screen" /> <data android:scheme="scheme_chatalyze" android:host="chat_screen" /> </intent-filter> <!-- app scheme 相关链接 --> <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:scheme="app" android:host="calls_screen" /> <data android:scheme="app" android:host="chat_screen" /> </intent-filter> <!-- scheme_chatalyze2 相关链接 --> <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:scheme="scheme_chatalyze2" android:host="chat_screen2" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity>
2. 正确实现onNewIntent处理深层链接
在MainScreensActivity中重写方法,将新Intent传递给导航控制器:
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.let { navController.handleDeepLink(it) setIntent(it) // 重置Activity的Intent,避免重复处理 } }
注:确保navController是Activity中全局持有的实例,比如在onCreate中通过rememberNavController()初始化并保存。
3. 修正PendingIntent的Uri生成与TaskStackBuilder用法
当前Uri包含字面量{}会导致参数解析异常,同时明确指定目标Activity:
private fun getPendingIntent( name: String?, sender: String, recipient: String, context: Context ): PendingIntent { // 生成带实际参数的Uri,移除字面量大括号 val deepLink = Uri.parse("scheme_chatalyze2://chat_screen2/${name.orEmpty()}/$sender/$recipient") val deepLinkIntent = Intent(Intent.ACTION_VIEW, deepLink).apply { setClass(context, MainScreensActivity::class.java) flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP } return TaskStackBuilder.create(context).run { addNextIntentWithParentStack(deepLinkIntent) getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) } }
4. 完善导航图的深层链接配置
确保参数名、类型与传递逻辑完全匹配,添加默认值避免空指针:
composable( route = ScreenRoute.ChatScreen.route, deepLinks = listOf( navDeepLink { uriPattern = "scheme_chatalyze2://chat_screen2/{$RECIPIENT_NAME}/{$RECIPIENT_PHONE}/{$SENDER_PHONE}" action = Intent.ACTION_VIEW categories = setOf(Intent.CATEGORY_DEFAULT, Intent.CATEGORY_BROWSABLE) } ), arguments = listOf( navArgument(RECIPIENT_NAME) { type = NavType.StringType defaultValue = "" }, navArgument(RECIPIENT_PHONE) { type = NavType.StringType defaultValue = "" }, navArgument(SENDER_PHONE) { type = NavType.StringType defaultValue = "" } ) ) { entry -> // 现有页面逻辑 }
5. 排除配置变化触发的重建
在Manifest中为Activity添加configChanges,避免非必要的重建:
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"
验证步骤
- 清理项目缓存并重新构建
- 测试通知跳转,观察Activity生命周期日志
- 检查导航栈状态,确保
ChatScreen正确入栈且无重复Activity实例
内容的提问来源于stack exchange,提问作者Роман Маринов
相关产品推荐
相关产品推荐

