Jetpack Compose Deeplink问题:应用活跃时无法跳转目标页面
问题:Jetpack Compose SingleInstance模式下DeepLink活跃态跳转失效
现象
- 应用关闭时,点击DeepLink可正常唤起应用并跳转至目标页面;
- 应用处于活跃/前台状态时,点击DeepLink仅唤起当前页面,无法跳转至目标页;
- 未设置
android:launchMode="singleInstance"时,DeepLink全程正常,但会创建应用新实例;设置该模式后,多实例问题解决,但活跃态下DeepLink跳转失效。
现有代码
MainContent导航代码
@Composable fun MainContent(navController: NavController) { NavHost( navController = navController, startDestination = "home" ) { // Home Screen composable("home") { HomeScreen(navController) } // Profile Screen 带DeepLink配置 composable( route = "profile/{userId}", deepLinks = listOf(navDeepLink { uriPattern = "https://www.example.com/profile/{userId}" }) ) { backStackEntry -> val userId = backStackEntry.arguments?.getString("userId") ProfileScreen(userId) } } }
尝试的LaunchedEffect处理代码
LaunchedEffect(deepLinkIntent.value) { Log.e("DeepLinkNavigation", "Deep Link Data Received: ${deepLinkUri.value}") deepLinkIntent.value?.let { intent -> navController.handleDeepLink(intent) /*val deepLinkRequest = NavDeepLinkRequest.Builder .fromUri(uri) .build() // Attempt to navigate using the deep link request if (navController.graph.hasDeepLink(deepLinkRequest)) { navController.handleDeepLink(deepLinkRequest) }*/ } /*deepLinkUri.value?.let { navController.navigate(it.toString()) }*/ }
日志可打印收到DeepLink数据,但导航无效果。
问题原因
设置singleInstance启动模式后,应用处于前台时,系统会将DeepLink的Intent通过onNewIntent()传递给Activity,而非重新创建Activity实例。默认情况下导航组件不会自动处理这个新Intent,需手动将其转发给NavController。
解决方案
1. 在Activity中重写onNewIntent()并更新状态
在承载Compose的Activity中,维护一个可观察的Intent状态变量,收到新Intent时更新该变量,触发LaunchedEffect处理导航:
class MainActivity : ComponentActivity() { private val deepLinkIntent = mutableStateOf<Intent?>(null) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化时传入启动Intent deepLinkIntent.value = intent setContent { YourAppTheme { val navController = rememberNavController() // 监听Intent变化并处理DeepLink LaunchedEffect(deepLinkIntent.value) { deepLinkIntent.value?.takeIf { it.data != null }?.let { navController.handleDeepLink(it) } } MainContent(navController) } } } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // 更新当前Intent并通知Composable this.intent = intent deepLinkIntent.value = intent } }
2. 确保Manifest配置正确
检查Activity的IntentFilter是否包含DeepLink的Scheme、Host和Path规则:
<activity android:name=".MainActivity" android:launchMode="singleInstance"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 匹配DeepLink规则 --> <data android:scheme="https" android:host="www.example.com" android:pathPrefix="/profile" /> </intent-filter> </activity>
3. 验证NavController的DeepLink处理逻辑
确保在LaunchedEffect中正确调用navController.handleDeepLink(intent),无需额外判断hasDeepLink,因为handleDeepLink会自动匹配NavGraph中的配置。
内容的提问来源于stack exchange,提问作者Rahul Mishra
相关产品推荐
相关产品推荐

