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
相关产品推荐
相关产品推荐

