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

Android12下NavDeepLinkBuilder创建PendingIntent缺少可变性标识如何解决

解决方案

方案1:升级Jetpack Navigation组件版本(推荐)

从Navigation 2.4.0-alpha01 版本开始,官方已经为NavDeepLinkBuilder新增了setPendingIntentFlags()方法,直接传入你需要的可变性标识即可,示例代码如下:

// 兼容不同系统版本的flag定义
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
    PendingIntent.FLAG_UPDATE_CURRENT
}

val myPendingIntent = NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_main)
        .setDestination(R.id.myFragment)
        .setArguments(
            myFragment.bundle(myArgs)
        )
        // 传入自定义flag
        .setPendingIntentFlags(flags)
        .createPendingIntent()
myRemoteViews.setOnClickPendingIntent(R.id.widget_button, myPendingIntent)

注意:如果你的业务场景需要后续修改PendingIntent的内容,请使用FLAG_MUTABLE,否则优先使用FLAG_IMMUTABLE提升安全性。

方案2:低版本Navigation兼容方案

如果你暂时无法升级Navigation组件版本,可以通过以下方式绕过限制,不会丢失参数传递能力:
首先用NavDeepLinkBuilder构造出对应的导航Intent,再手动调用PendingIntent.getActivity()添加可变性标识:

val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
    PendingIntent.FLAG_UPDATE_CURRENT
}

// 先通过NavDeepLinkBuilder构造携带参数的导航Intent
val navIntent = NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_main)
        .setDestination(R.id.myFragment)
        .setArguments(
            myFragment.bundle(myArgs)
        )
        .createTaskStackBuilder()
        .getIntent(0) // 取出构造好的携带导航参数的Intent

// 手动创建PendingIntent,添加必填的可变性标识
val myPendingIntent = PendingIntent.getActivity(
    context,
    0,
    navIntent,
    flags
)
myRemoteViews.setOnClickPendingIntent(R.id.widget_button, myPendingIntent)

这个方案本质是复用NavDeepLinkBuilder生成参数的逻辑,自己控制PendingIntent的flag设置,参数会完整保留,导航逻辑和原来完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:15:07