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

Android:应用前台时处理API返回Deep Link的导航问题

解决Navigation Component前台处理Deep Link不导航的问题

以下几种方法可以避免重启Activity,实现前台时Deep Link的正确导航:

setContentView执行后,NavController可能还未完全绑定到宿主视图,直接调用handleDeepLink会因视图未初始化而失效。可以通过以下两种方式延迟执行:

方法A:使用ViewTreeObserver监听视图加载

val rootView = binding.root
rootView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        rootView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        val navController = findNavController(R.id.nav_host_fragment)
        val deepLinkIntent = Intent(Intent.ACTION_VIEW, Uri.parse("your_deep_link_uri"))
        navController.handleDeepLink(deepLinkIntent)
    }
})

方法B:使用View.post延迟执行

binding.root.post {
    val navController = findNavController(R.id.nav_host_fragment)
    val deepLinkUri = Uri.parse("your_deep_link_uri")
    navController.handleDeepLink(Intent(Intent.ACTION_VIEW, deepLinkUri))
}

2. 手动解析Deep Link并触发导航

如果handleDeepLink未自动触发导航,可以手动匹配Deep Link对应的目的地,直接调用navigate方法:

val navController = findNavController(R.id.nav_host_fragment)
val deepLinkUri = Uri.parse("your_deep_link_uri")

// 匹配Deep Link对应的目的地
val deepLinkMatch = navController.graph.matchDeepLink(deepLinkUri)
deepLinkMatch?.destination?.let { destination ->
    // 提取Deep Link参数(可选)
    val args = navController.createDeepLink().setUri(deepLinkUri).createBundle()
    // 执行导航
    navController.navigate(destination.id, args)
}

3. 借助ViewModel暂存Deep Link,在Fragment就绪后处理

若Activity前台时目标Fragment尚未初始化,可将Deep Link暂存到ViewModel,待Fragment加载完成后再处理:

第一步:在ViewModel中定义暂存变量

class MainViewModel : ViewModel() {
    val pendingDeepLink = MutableLiveData<Uri?>()
}

第二步:Activity获取Deep Link后存入ViewModel

val viewModel = ViewModelProvider(this)[MainViewModel::class.java]
viewModel.pendingDeepLink.value = deepLinkUri

第三步:目标Fragment中监听并处理

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val viewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
    viewModel.pendingDeepLink.observe(viewLifecycleOwner) { uri ->
        uri?.let {
            findNavController().navigate(it)
            // 处理后清空,避免重复触发
            viewModel.pendingDeepLink.value = null
        }
    }
}

4. 检查Deep Link配置与Intent处理逻辑

  • 确认导航图中Deep Link的scheme、host、path与传入的URI完全匹配,且目的地存在;
  • 若Activity在前台时通过新Intent接收Deep Link,需在onNewIntent中处理:
override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    intent?.let {
        val navController = findNavController(R.id.nav_host_fragment)
        navController.handleDeepLink(it)
    }
}

内容的提问来源于stack exchange,提问作者Regress.arg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:17:22