应用程序空闲时尝试接收GCM通知失败

时间:2015-01-15 16:24:49

标签: c# android xamarin google-cloud-messaging android-broadcast

我给了它几次尝试但没有一个有效。根据我的理解,这应该保持我的广播接收器的实例运行,无论该应用程序是否进入后台,空闲或关闭。一旦它打开,接收器就会继续运行(除非强制关闭?)。

我没有向我的GCM入站消息发送delay_while_idle标志,这是我如何推送消息的示例。

{
    "data": 
    {
        "alert": "message",
        "badge":"0"
    },
    "registration_ids": ["1234567890abcdefghij"]
}

我仍然对这个话题感到有些困惑,但到目前为止这就是我所处的位置。 注意这个问题就在我打开应用程序,转到另一个应用程序或只是打回家的时候。经过x一段时间后系统我猜这个应用程序闲置了。还在运行,只是不积极。在此状态期间,我的应用程序将不会在需要时处理传入的GCM广播。

首先,我在我的应用程序类中声明我的广播接收器。

public class MyApplication : global::Android.App.Application
{

    public static MyGCMBroadcastReceiver BroadcastReceiver = new MyGCMBroadcastReceiver();

}

以下是我的广播接收器。

[BroadcastReceiver(Permission = "com.google.android.c2dm.permission.SEND")]
[IntentFilter(new string[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { Configuration.Current.PackageName })]
[IntentFilter(new string[] { "com.google.android.c2dm.intent.REGISTRATION" }, Categories = new string[] { Configuration.Current.PackageName })]
[IntentFilter(new string[] { "com.google.android.gcm.intent.RETRY" }, Categories = new string[] { Configuration.Current.PackageName })]
public class MyGCMBroadcastReceiver : BroadcastReceiver
{

    private PowerManager.WakeLock wakeLock = null;

    public override void OnReceive(Context context, Intent intent)
    {
        AcquireWakeLock(context);

        MyIntentService.RunIntentInService(context, intent);

        SetResult(Result.Ok, null, null);
    }

    public void AcquireWakeLock(Context context)
    {
        PowerManager powerManager = PowerManager.FromContext(context);

        wakeLock = powerManager.NewWakeLock(WakeLockFlags.Partial, "GCM Broadcast Receiver Tag");

        wakeLock.Acquire();
    }

    public void ReleaseWakeLock()
    {
        if (wakeLock != null)
            wakeLock.Release();
    }

}

MyApplication.BroadcastReceiver.ReleaseWakeLock();在我的intentservice类中生成通知的代码之后调用。我这样做是因为我虽然很快就会释放唤醒锁。

1 个答案:

答案 0 :(得分:1)

对于接收者,您可以扩展WakefulBroadcastReceiver类而不是BroadcastReceiver

帮助实现接收设备唤醒事件的BroadcastReceiver的通用模式,然后将工作传递给Service,同时确保设备在转换期间不会重新进入休眠状态

有关详细信息,请参阅here