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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:36:03