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

点击DeepLink出现重复Activity实例的问题求助

解决DeepLink触发导致Activity实例重复的问题

核心原因

冷启动触发DeepLink时,若未正确配置Activity启动模式及DeepLink Intent的后续处理,系统可能会创建多个Activity实例;同时Compose Navigation的DeepLink需要主动处理新Intent才能完成正确导航,否则也可能引发实例重复或导航失效的问题。

具体解决步骤

1. 配置Activity启动模式

在AndroidManifest.xml中给MainActivity设置launchMode="singleTask",确保整个任务栈中仅存在一个Activity实例:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.MyApplication"
    android:launchMode="singleTask"> <!-- 添加启动模式配置 -->
    <!-- 原有intent-filter保持不变 -->
</activity>

2. 重写onNewIntent处理DeepLink Intent

singleTask模式下触发DeepLink时,系统会复用已有的Activity实例并调用onNewIntent,需要将新Intent传递给NavController以完成导航:

class MainActivity : ComponentActivity() {
    private var navController: NavController? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        Log.d("Blah", "onCreate!!!")

        setContent {
            MyApplicationTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    val navController = rememberNavController()
                    // 将NavController引用保存到Activity
                    DisposableEffect(Unit) {
                        this@MainActivity.navController = navController
                        onDispose {
                            this@MainActivity.navController = null
                        }
                    }

                    NavHost(
                        navController = navController,
                        startDestination = "screen-1"
                    ) {
                        // 原有composable配置保持不变
                        composable(
                            "screen-1",
                            deepLinks = listOf(
                                navDeepLink {
                                    uriPattern = "myscheme://app/screen-1"
                                    action = Intent.ACTION_VIEW
                                }
                            )
                        ) {
                            Text("Screen 1", Modifier.padding(innerPadding))
                        }
                        composable(
                            "screen-2",
                            deepLinks = listOf(
                                navDeepLink {
                                    uriPattern = "myscheme://app/screen-2"
                                    action = Intent.ACTION_VIEW
                                }
                            )
                        ) {
                            Text("Screen 2", Modifier.padding(innerPadding))
                        }
                    }
                }
            }
        }
        // 处理冷启动时的初始DeepLink Intent
        intent?.let { navController?.handleDeepLink(it) }
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        // 将新Intent传递给NavController处理DeepLink
        navController?.handleDeepLink(intent)
    }
}

3. 校验IntentFilter配置

确保Manifest中的DeepLink IntentFilter无重复或冲突:

  • 不要给同一个Activity设置多个重复的DeepLink IntentFilter
  • 保证android:scheme和android:host与Compose Navigation中配置的uriPattern完全匹配

4. 清理不必要的Task Affinity设置

如果之前手动设置了android:taskAffinity,请移除或设置为应用包名(默认值),否则可能导致系统创建新任务栈,进而产生多个Activity实例。

验证方法

  1. 完全关闭应用(从后台清除)
  2. 用命令行触发DeepLink:adb shell am start -a android.intent.action.VIEW -d "myscheme://app/screen-2"
  3. 查看Logcat中的Blah标签,确认onCreate!!!仅打印一次

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:04:55