Android NavDeepLinkBuilder设置参数为null及API适配问题求助
一、修复NavDeepLinkBuilder参数无法获取的问题
问题根源在于你错误地在SplashActivity中直接读取Intent的extras——NavDeepLinkBuilder生成的深层链接参数并非直接暴露给Activity,而是由Navigation组件负责解析并传递到目标页面。正确做法是让SplashActivity中的NavController处理这个深层链接:
- 在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) } }
- 在目标页面(如
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
相关产品推荐
相关产品推荐

