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

FragmentHostCallback.getContext()空指针异常 导航组件deeplink跳转Fragment随机崩溃

崩溃原因

该空指针异常是Navigation Component低版本的已知时序问题:应用在后台被销毁后,通过deep link直接唤起目标Fragment时,Fragment的attach生命周期回调触发早于Fragment宿主的FragmentHostCallback初始化完成,导致调用getContext()时拿到空对象。

必现场景
  • 应用进程处于后台被系统回收状态
  • 从外部入口(通知、浏览器、桌面快捷方式等)触发deep link直接跳转目标Fragment
  • 宿主Activity重建时,FragmentManager的pending导航任务执行时序早于宿主初始化完成
修复方案

方案1:升级依赖(优先选择)

该问题已在官方高版本依赖中修复,将以下依赖升级到对应版本及以上即可:

  • androidx.navigation:navigation-fragment-ktx:2.4.0
  • androidx.fragment:fragment-ktx:1.4.0

方案2:临时兼容(无法升级依赖时使用)

在导航宿主对应的Activity的onCreate方法中,调整deep link的处理时序,等Activity完全初始化后再执行导航:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    val navHost = supportFragmentManager.findFragmentById(R.id.nav_host) as NavHostFragment
    val navController = navHost.navController
    
    // 仅首次创建且有deep link数据时延迟处理
    if (savedInstanceState == null && intent?.data != null) {
        // 等View绘制完成后再处理导航,保证宿主初始化完成
        window.decorView.post {
            navController.handleDeepLink(intent)
            // 处理完成清空intent,避免屏幕旋转等场景重复触发
            intent = null
        }
    }
}

额外检查项

确认目标Fragment的onAttach、onCreate等早期生命周期方法中,没有直接调用requireContext()、requireActivity()的逻辑,这类调用可以移动到onViewCreated生命周期之后执行,或者添加空判断保护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:45:03