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

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"

验证步骤

  1. 清理项目缓存并重新构建
  2. 测试通知跳转,观察Activity生命周期日志
  3. 检查导航栈状态,确保ChatScreen正确入栈且无重复Activity实例

内容的提问来源于stack exchange,提问作者Роман Маринов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:50:29