无URI的Matter配网Intent在Jetpack Compose中无法触发导航怎么办?
解决Jetpack Compose中基于Action的Matter配网Intent导航问题
问题分析
你的DeepLink语法配置本身没问题,但Jetpack Navigation不会自动处理启动Activity的Intent,需要手动将Intent传递给导航控制器,同时还要处理Activity处于后台时接收的新Intent。
解决方案步骤
在Activity中传递Intent给导航控制器
无论是Activity首次启动还是从后台唤醒,都要把触发的Intent交给navController处理:class MainActivity : ComponentActivity() { private var navController: NavController? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyAppTheme { navController = rememberNavController() NavHost( navController = navController!!, startDestination = "home_screen" ) { lowpanGraph(appState = rememberAppState(navController!!)) } } // 处理首次启动的Intent intent?.let { navController?.handleDeepLink(it) } } } // 处理Activity后台时收到的新Intent override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.let { navController?.handleDeepLink(it) } } }保留正确的DeepLink配置
你原本的composable配置是有效的,继续使用即可:fun NavGraphBuilder.lowpanGraph(appState: LowpanAppState) { composable( route = "$DEVICES_SCREEN", deepLinks = listOf( navDeepLink { action = "com.google.android.gms.home.matter.ACTION_COMMISSION_DEVICE" } ) ) { DevicesScreen(openScreen = { route -> appState.navigate(route) }) } }优化Manifest中的Activity配置
给Activity设置合适的launchMode(比如singleTop),避免重复创建实例,确保Intent能正确传递到已存在的Activity:<activity android:name=".MainActivity" android:launchMode="singleTop" ...> <intent-filter> <action android:name="com.google.android.gms.home.matter.ACTION_COMMISSION_DEVICE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
关键说明
navController.handleDeepLink(intent)是核心操作:它会解析Intent中的Action,匹配你配置的DeepLink规则,自动导航到对应的DevicesScreen。- 必须处理
onNewIntent:如果应用已在后台运行,GPS发送的Intent会触发onNewIntent而非onCreate,因此这里也要传递Intent给导航控制器。
内容的提问来源于stack exchange,提问作者Jon Smirl
相关产品推荐
相关产品推荐

