Xamarin.Forms:应用程序关闭时广播接收器不起作用

4
我正在使用Xamarin.Forms开发一个应用程序,大部分都正常工作,但是我无法找到一种方法在应用程序未运行时使广播接收器生效,即使它被Android“轻轻地”关闭而非用户强制关闭。
当应用程序在前台或后台运行但尚未被杀死时,广播接收器本身可以正常工作。我已经花了几天时间寻找解决方案,但始终未能成功。我在Xamarin论坛和这里看到了一些提示,要将我的广播接收器声明在服务中,并在MainActivity文件中启动该服务,尽管似乎服务正在运行,但仍然无法处理我的本地通知。
就我所知,在Java Android开发中,您只需在清单文件中声明接收器即可使其工作,但是在使用Xamarin的(其他很棒的)技术时似乎不是这种情况。
我希望您们中的一些人也遇到了这个问题并知道解决方案,因为我非常绝望。非常感谢您的时间,祝您有愉快的一天!
编辑:
广播接收器是使用Xamarin的代码方式声明的,在生成的清单中如下所示: 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中时,一切都运行良好。

你把Intent放在哪里了?是在一个动作或事件期间吗? - Aljohn Yamaro
2个回答

1
你需要在应用清单中添加一个后台运行的权限。 查看我的可行解决方案这里

谢谢,我只使用本地通知,虽然我认为我已经解决了部分问题。现在似乎广播接收器确实启动了,但是应用程序随后崩溃。我将整个通知逻辑移动到简单的占位符项目中,并在那里进行实验...我怀疑我的接收器的Context参数存在问题,它也是同时充当闹钟设置器的类(或者这是错误的?)。如果您能看一下原始帖子中的一些代码片段,我会编辑它。无论如何,非常感谢! - Martin Pokorný

0
原来我是个彻头彻尾的白痴;问题不在接收器或闹钟设置器中。我在我的本地通知服务中处理了错误的上下文。一直以来我都在使用Forms.Context而不是由接收器传递的上下文。
对于浪费你们的时间,我感到非常抱歉。谢谢你们的帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接