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
相关产品推荐
相关产品推荐

