Xamarin.Forms:广播接收器在应用程序关闭时不工作
Xamarin.Forms: Broadcast receiver not working when app is closed
我正在使用 Xamarin.Forms 开发一个应用程序,虽然它的大部分工作正常,但当应用程序不在 RAM 中时,我无法找到让我的广播接收器工作的方法 - 并且这意味着即使它 "gently" 被 Android 关闭,而不是用户强行关闭它。
当应用程序 运行 在前台或应用程序在后台时,广播接收器本身工作正常,但尚未终止。我已经花了几天时间寻找解决方案,但我无法成功。我在 Xamarin 论坛上看到了一些提示,在这里可以在服务中声明我的广播接收器,并在 MainActivity 文件中启动该服务,虽然看起来服务是 运行,但它仍然没有做与我的本地通知有关的任何内容。
据我了解,在 Java Android 开发中,您所要做的就是在清单文件中声明接收器,它会起作用,但这似乎不是使用 Xamarin(否则很棒)技术时的情况。
我希望你们中的一些人也遇到过这个问题并且知道解决方案,因为我非常绝望。非常感谢您的宝贵时间,祝您有愉快的一天!
编辑:
Receiver 是使用 Xamarin 的代码方式声明的,在生成的 Manifest 中它看起来像这样:
receiver android:name="md5d0a2bd06806e04fc29264ca7dfdf52f5.AlarmService"
这是 BroadcastReceiver 本身:
[BroadcastReceiver(Enabled=true)]
public class AlarmService : BroadcastReceiver, IAlarmService
{
List<LocalNotification> notifications;
public override void OnReceive (Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.GetSystemService(Context.PowerService);
PowerManager.WakeLock wl = pm.NewWakeLock(WakeLockFlags.Partial, "");
wl.Acquire();
Intent resultIntent = new Intent(context, context.GetType());
resultIntent.PutExtra ("Notification", true);
IList<string> values = intent.GetStringArrayListExtra ("NotificationStrings");
new LocalNotificationService(context).Notify (values [0], values [1], values [2], values[3]);
wl.Release();
}
它收到的 PendingIntent 是这样设置的:
Intent intent = new Intent (context, typeof(AlarmService));
intent.SetAction (notifications [requestCode].Id ?? Guid.NewGuid ().ToString ());
intent.PutStringArrayListExtra ("NotificationStrings", new List<string>() {
notifications [requestCode].Title,
notifications [requestCode].Body,
notifications [requestCode].AlertAction,
notifications [requestCode].UserData,
notifications [requestCode].Id
});
AlarmManager am = (AlarmManager)context.GetSystemService(Context.AlarmService);
PendingIntent pi = PendingIntent.GetBroadcast(context, 0, intent, 0);
am.Set (AlarmType.RtcWakeup, (long)(Java.Lang.JavaSystem.CurrentTimeMillis () + (dateTime.Value.ToUniversalTime () - DateTime.Now.ToUniversalTime ()).TotalMilliseconds), pi);
然而,即使我删除了 OnReceive 中的代码,我也没有什么反应,而是收到系统消息,指出应用程序已停止工作,这让我认为一定是 Context 或 Intent 出了问题 - 一切正常当应用 Activity 在 RAM 中时。
您需要在应用程序清单中在后台添加对运行的权限。
查看我的工作解决方案
原来我是个彻头彻尾的白痴;问题不在接收器中,也不在警报 setter 中。我在 LocalNotificationService 中处理了错误的上下文。我一直在使用 Forms.Context 而不是我的接收者传递的上下文。
抱歉浪费你们的时间,伙计们。感谢您的帮助!
我正在使用 Xamarin.Forms 开发一个应用程序,虽然它的大部分工作正常,但当应用程序不在 RAM 中时,我无法找到让我的广播接收器工作的方法 - 并且这意味着即使它 "gently" 被 Android 关闭,而不是用户强行关闭它。
当应用程序 运行 在前台或应用程序在后台时,广播接收器本身工作正常,但尚未终止。我已经花了几天时间寻找解决方案,但我无法成功。我在 Xamarin 论坛上看到了一些提示,在这里可以在服务中声明我的广播接收器,并在 MainActivity 文件中启动该服务,虽然看起来服务是 运行,但它仍然没有做与我的本地通知有关的任何内容。
据我了解,在 Java Android 开发中,您所要做的就是在清单文件中声明接收器,它会起作用,但这似乎不是使用 Xamarin(否则很棒)技术时的情况。
我希望你们中的一些人也遇到过这个问题并且知道解决方案,因为我非常绝望。非常感谢您的宝贵时间,祝您有愉快的一天!
编辑:
Receiver 是使用 Xamarin 的代码方式声明的,在生成的 Manifest 中它看起来像这样:
receiver android:name="md5d0a2bd06806e04fc29264ca7dfdf52f5.AlarmService"
这是 BroadcastReceiver 本身:
[BroadcastReceiver(Enabled=true)]
public class AlarmService : BroadcastReceiver, IAlarmService
{
List<LocalNotification> notifications;
public override void OnReceive (Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.GetSystemService(Context.PowerService);
PowerManager.WakeLock wl = pm.NewWakeLock(WakeLockFlags.Partial, "");
wl.Acquire();
Intent resultIntent = new Intent(context, context.GetType());
resultIntent.PutExtra ("Notification", true);
IList<string> values = intent.GetStringArrayListExtra ("NotificationStrings");
new LocalNotificationService(context).Notify (values [0], values [1], values [2], values[3]);
wl.Release();
}
它收到的 PendingIntent 是这样设置的:
Intent intent = new Intent (context, typeof(AlarmService));
intent.SetAction (notifications [requestCode].Id ?? Guid.NewGuid ().ToString ());
intent.PutStringArrayListExtra ("NotificationStrings", new List<string>() {
notifications [requestCode].Title,
notifications [requestCode].Body,
notifications [requestCode].AlertAction,
notifications [requestCode].UserData,
notifications [requestCode].Id
});
AlarmManager am = (AlarmManager)context.GetSystemService(Context.AlarmService);
PendingIntent pi = PendingIntent.GetBroadcast(context, 0, intent, 0);
am.Set (AlarmType.RtcWakeup, (long)(Java.Lang.JavaSystem.CurrentTimeMillis () + (dateTime.Value.ToUniversalTime () - DateTime.Now.ToUniversalTime ()).TotalMilliseconds), pi);
然而,即使我删除了 OnReceive 中的代码,我也没有什么反应,而是收到系统消息,指出应用程序已停止工作,这让我认为一定是 Context 或 Intent 出了问题 - 一切正常当应用 Activity 在 RAM 中时。
您需要在应用程序清单中在后台添加对运行的权限。
查看我的工作解决方案
原来我是个彻头彻尾的白痴;问题不在接收器中,也不在警报 setter 中。我在 LocalNotificationService 中处理了错误的上下文。我一直在使用 Forms.Context 而不是我的接收者传递的上下文。
抱歉浪费你们的时间,伙计们。感谢您的帮助!