Xamarin官方前台服务示例启动触发空引用异常崩溃问题求解
Xamarin Android 前台服务PendingIntent空引用崩溃修复
问题表现
- 基于官方ForegroundServiceDemo示例开发Xamarin前台服务,编译部署到三星S10设备后,点击「Start Service」按钮应用直接崩溃
- 崩溃触发位置为
TimeStampService.cs第155行,对应代码:
var pendingIntent = PendingIntent.GetActivity(this, 0, notificationIntent, PendingIntentFlags.UpdateCurrent);
- 抛出异常类型为空引用异常,堆栈跟踪信息:
at Android.Runtime.JNINativeWrapper._unhandled_exception (System.Exception e) [0x0000e] in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:12 at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPLII_I (_JniMarshal_PPLII_I callback, System.IntPtr jnienv, System.IntPtr klazz, System.IntPtr p0, System.Int32 p1, System.Int32 p2) [0x00022] in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:221 at (wrapper native-to-managed) Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPLII_I(intptr,intptr,intptr,int,int)
- 已尝试全量更新依赖版本、从零新建空白服务项目测试,问题仍稳定复现
根因
该崩溃是Android 12(API 31)及以上版本的系统行为变更导致:从API31开始,所有PendingIntent创建时必须显式声明可变性标志(PendingIntentFlags.Mutable或PendingIntentFlags.Immutable),未声明时系统会直接拒绝创建PendingIntent并抛出异常。
官方示例长期未适配该系统规则,三星S10出厂或更新后的系统版本多为Android12及以上,因此稳定触发崩溃。你看到的空引用异常是Xamarin Android运行时对原生层异常包装不当产生的误导性报错,并非代码中存在未赋值的空对象。
修复步骤
- 修改PendingIntent创建逻辑,按系统版本补充对应的可变性标志,绝大多数前台服务通知点击场景使用
Immutable标志即可,修复后代码如下:
var pendingIntentFlags = PendingIntentFlags.UpdateCurrent; // Android12及以上版本强制要求指定PendingIntent可变性 if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.S) { pendingIntentFlags |= PendingIntentFlags.Immutable; } var pendingIntent = PendingIntent.GetActivity(this, 0, notificationIntent, pendingIntentFlags);
- 配套检查项
- 确认项目目标框架版本设置不低于Android 12 (API 31),否则编译时无法识别可变性标志枚举值
- 如果后续需要更新该PendingIntent携带的Intent额外参数,将上述代码中的
Immutable替换为Mutable即可 - 提前确认
notificationIntent对应的目标Activity已在应用清单文件中正确注册,避免后续触发Activity未找到异常
内容的提问来源于stack exchange,提问作者Hallupa
相关产品推荐
相关产品推荐

