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

Android应用关闭时GCM推送失效并崩溃的问题求助

我帮你分析下问题的核心原因,以及对应的解决步骤:

从你抛出的异常和代码来看,崩溃的根源是当应用完全关闭时,GCM服务被唤醒,但此时Xamarin.Forms还未初始化,而你的代码中调用了依赖Xamarin.Forms的App.LocalAlert方法。下面是具体的解决办法:

1. 移除后台服务中对Xamarin.Forms的UI依赖

在CreateNotification和OnMessage的catch块里,你调用了App.LocalAlert——这是一个Xamarin.Forms的前端UI方法,而当应用处于关闭状态时,Forms的运行环境还未建立,调用它必然会触发初始化异常。

你可以把这段代码换成Android原生的日志输出或者系统提示(比如Toast),完全避开Forms依赖:

catch (Exception e)
{
    Debug.WriteLine($"创建通知出错: {e.Message}\n{e.StackTrace}");
    // 用Android原生Toast替代Forms的Alert,后台服务可以正常调用
    Toast.MakeText(this, "Erro ao criar notificação.", ToastLength.Short).Show();
}

2. (可选兜底)在GCM服务启动时提前初始化Xamarin.Forms

如果你的服务中确实需要用到Forms的某些非UI功能(不推荐在后台服务引入Forms),可以在GcmService的OnCreate方法中提前完成Forms初始化,避免未初始化异常:

public override void OnCreate()
{
    base.OnCreate();
    // 仅当Forms未初始化时执行初始化
    if (!Xamarin.Forms.Forms.IsInitialized)
    {
        Xamarin.Forms.Forms.Init(this, null);
    }
}

不过还是建议后台服务只处理系统级逻辑(比如创建通知),不要牵扯前端UI相关的操作,这更符合Android后台服务的设计规范。

3. 检查GCM服务的配置准确性

  • 确认权限配置中的包名和你的应用实际包名完全一致:你当前权限中的myProject要替换成br.com.siagri.SiagriAutorize,否则权限不匹配会导致推送接收异常。
  • 检查你的GcmService是否正确继承了GcmListenerService,并且通过特性或者Manifest完成了注册。如果是手动注册Manifest,确保Service的声明正确:
<service android:name="md5d8b390bb35897e87a51d1b4384dffa30/GcmService" android:exported="false">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
  </intent-filter>
</service>

4. 验证推送逻辑的合理性

当应用关闭时,GCM推送只会唤醒你的后台服务来创建通知,不会启动整个应用的Forms页面——你的CreateNotification中创建的PendingIntent是点击通知时才打开MainActivity,这个逻辑是正确的,不需要修改。

按照上面的步骤调整后,应用关闭状态下的推送应该就能正常工作了。

内容的提问来源于stack exchange,提问作者Pedro Franco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:05