点击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实例。
验证方法
- 完全关闭应用(从后台清除)
- 用命令行触发DeepLink:
adb shell am start -a android.intent.action.VIEW -d "myscheme://app/screen-2" - 查看Logcat中的
Blah标签,确认onCreate!!!仅打印一次
内容的提问来源于stack exchange,提问作者user648462
相关产品推荐
相关产品推荐

