C#开发中如何实现应用关闭状态下接收本地通知
C# 移动端应用完全关闭状态下接收本地通知解决方案
平台差异说明
- 安卓平台支持APP完全关闭后通过系统广播唤起接收器处理本地通知
- iOS平台仅支持系统自动展示你提前通过
UNUserNotificationCenter注册的定时本地通知,无法执行自定义代码逻辑;如果仅需处理通知点击事件,只需在FinishedLaunching中注册通知响应即可,无需额外配置接收器。
安卓平台问题排查与修复步骤
1. 静态注册本地通知广播接收器
不要使用动态注册的广播接收器,动态注册仅在APP运行时生效,必须使用静态注册方式让系统在APP关闭时也能找到对应的接收器,示例代码:
[BroadcastReceiver(Enabled = true, Exported = true)] [IntentFilter(new[] { "你的自定义本地通知Action标识" })] public class LocalNotificationReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { // 复用你之前前台/后台状态下的通知处理逻辑即可 var notificationManager = NotificationManager.FromContext(context); // 构建并弹出通知的逻辑 } }
注意安卓12及以上必须给接收器加Exported = true属性,否则系统无法跨进程唤起你的接收器。
2. 补全所需权限
你之前修改过权限,但可能遗漏了高版本安卓要求的必选权限,需在AndroidManifest.xml中添加如下声明:
<!-- 安卓13及以上通知必备权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- 唤醒设备保证接收器正常执行 --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 开机自启权限,用于重启后恢复定时通知 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
注意POST_NOTIFICATIONS权限除了静态声明,还需要在APP首次启动时主动申请动态权限,否则系统不会授予该权限。
3. 调整定时通知触发方式
不要使用APP内的定时器触发通知,APP关闭后定时器会被销毁,必须使用系统级的AlarmManager或WorkManager触发通知,示例代码:
var alarmManager = (AlarmManager)GetSystemService(AlarmService); var intent = new Intent(this, typeof(LocalNotificationReceiver)); intent.SetAction("你的自定义本地通知Action标识"); // 安卓12及以上必须指定Immutable或Mutable标识 var pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable); // 示例:设置10秒后触发通知,支持重复触发 alarmManager.SetExactAndAllowWhileIdle(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + 10 * 1000, pendingIntent);
4. 修正开机广播接收器逻辑
设备重启后所有AlarmManager配置的定时任务都会被清空,你实现的BootReceiver需要在开机时重新注册所有定时通知,示例代码:
[BroadcastReceiver(Enabled = true, Exported = true)] [IntentFilter(new[] { Intent.ActionBootCompleted })] public class BootReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { if (intent.Action == Intent.ActionBootCompleted) { // 读取本地存储的所有待触发通知配置,重新通过AlarmManager注册 } } }
额外说明
国内定制安卓系统(小米、华为、vivo等)默认禁止第三方应用自启动、后台弹出界面,你需要新增引导页面,引导用户手动在系统设置中开启对应权限,否则即使代码配置正确也无法收到通知。
内容的提问来源于stack exchange,提问作者user16937336
相关产品推荐
相关产品推荐

