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

Android NavDeepLinkBuilder设置参数为null及API适配问题求助

解决NavDeepLinkBuilder参数丢失及API31+ PendingIntent崩溃问题

一、修复NavDeepLinkBuilder参数无法获取的问题

问题根源在于你错误地在SplashActivity中直接读取Intent的extras——NavDeepLinkBuilder生成的深层链接参数并非直接暴露给Activity,而是由Navigation组件负责解析并传递到目标页面。正确做法是让SplashActivity中的NavController处理这个深层链接:

  1. 在SplashActivity中初始化NavController并调用handleDeepLink方法:
class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        val navController = navHostFragment.navController

        // 让Navigation组件解析深层链接,参数会自动传递到目标页面
        navController.handleDeepLink(intent)

        // 执行你的启动逻辑,比如跳转到主流程
        navController.navigate(R.id.action_splash_to_main)
    }
}
  1. 在目标页面(如nav_settings对应的Fragment)中通过Navigation安全参数获取值:
class SettingsFragment : Fragment() {
    // 使用Navigation安全参数生成的Args类
    private val args: SettingsFragmentArgs by navArgs()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val value = args.key
        Log.d("SettingsFragment", "获取到参数: $value")
        return inflater.inflate(R.layout.fragment_settings, container, false)
    }
}

二、解决API31+ PendingIntent崩溃问题

API 31开始,Android要求所有PendingIntent必须显式指定FLAG_IMMUTABLE或FLAG_MUTABLE,未指定会抛出IllegalArgumentException。解决方式分两种:

方式1:升级Navigation组件版本

确保你的Navigation组件版本≥2.4.0,该版本及以上已自动适配API31的要求,会为生成的PendingIntent添加正确的FLAG_IMMUTABLE(默认行为)。

方式2:手动设置PendingIntent Flag(旧版本Navigation)

如果无法升级组件版本,可在NavDeepLinkBuilder中手动指定Flag:

NavDeepLinkBuilder(context)
    .setComponentName(SplashActivity::class.java)
    .setGraph(R.navigation.navigation)
    .setDestination(R.id.nav_settings)
    .setArguments(bundleOf("key" to "value"))
    // 针对API31+设置不可变Flag,若需修改PendingIntent则用FLAG_MUTABLE
    .setPendingIntentFlags(PendingIntent.FLAG_IMMUTABLE)
    .createPendingIntent()

注意:如果你的业务需要修改PendingIntent的内容(比如更新通知参数),则使用FLAG_MUTABLE,否则优先用FLAG_IMMUTABLE以保证安全性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:35:26