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

Android应用关闭时如何通过Firebase获取推送通知?

FCM 后台通知接收问题排查与解决

我的Android应用在前台/打开状态下FCM通知正常,但关闭应用后无法接收,想实现类似Telegram的后台通知效果。已尝试开启自启动,想问能不能不用自启动解决?怀疑是每次重启刷新Token导致通知无法送达,相关代码如下:

public App()
{
    InitializeComponent();

    MainPage = new MainPage();

    CrossFirebasePushNotification.Current.Subscribe("all");
    CrossFirebasePushNotification.Current.OnTokenRefresh += Current_OnTokenRefresh;
}

private void Current_OnTokenRefresh(object source, FirebasePushNotificationTokenEventArgs e)
{
    System.Diagnostics.Debug.WriteLine($"Token: {e.Token}");
}

问题分析与解决方案

  • Token 同步是核心问题:FCM Token 不会每次重启都刷新,仅在设备重置、应用卸载重装、系统安全设置变更等场景触发刷新。你当前的代码只打印Token但未同步到后端服务器——如果后端仍用旧Token发通知,自然收不到。必须确保首次启动获取Token和Token刷新时,都将最新值上报并替换后端的旧记录。

  • 无需自启动实现后台通知:Android 中FCM依赖Google Play Services的系统通道推送,只要配置正确,无需自启动也能接收后台通知,需检查以下项:

    1. 完整配置Firebase服务:AndroidManifest.xml中需正确声明com.google.firebase.messaging.FirebaseMessagingService的自定义实现,重写OnMessageReceived方法处理数据消息(后台时系统会自动处理纯通知消息)。
    2. 区分通知/数据消息:纯通知消息由系统直接展示,数据消息需通过自定义MessagingService在后台接收处理。
    3. 适配国产ROM管控:小米、华为等ROM有后台限制,无需开自启动,但需引导用户将应用加入「后台保护白名单」,这是系统层面限制,无法完全绕过。
  • 代码优化建议:

    1. 首次启动主动获取并上报Token:
      protected override async void OnStart()
      {
          base.OnStart();
          var token = await CrossFirebasePushNotification.Current.GetTokenAsync();
          if (!string.IsNullOrEmpty(token))
          {
              // 上报Token到你的后端服务器
              // await YourBackendService.UpdateDeviceToken(token);
          }
      }
      
    2. 刷新Token时同步到后端:
      private void Current_OnTokenRefresh(object source, FirebasePushNotificationTokenEventArgs e)
      {
          System.Diagnostics.Debug.WriteLine($"Token: {e.Token}");
          // 同步新Token到后端
          // YourBackendService.UpdateDeviceToken(e.Token);
      }
      

内容的提问来源于stack exchange,提问作者tomas shelby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:02:20