我给了它几次尝试但没有一个有效。根据我的理解,这应该保持我的广播接收器的实例运行,无论该应用程序是否进入后台,空闲或关闭。一旦它打开,接收器就会继续运行(除非强制关闭?)。
我没有向我的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类中生成通知的代码之后调用。我这样做是因为我虽然很快就会释放唤醒锁。
答案 0 :(得分:1)
对于接收者,您可以扩展WakefulBroadcastReceiver
类而不是BroadcastReceiver
。
帮助实现接收设备唤醒事件的BroadcastReceiver
的通用模式,然后将工作传递给Service
,同时确保设备在转换期间不会重新进入休眠状态
有关详细信息,请参阅here。