【问题标题】:Xamarin - Alarm triggers but Receiver doesn't get calledXamarin - 警报触发但接收器没有被调用
【发布时间】:2020-07-23 08:30:01
【问题描述】:

所以我使用AlarmManager设置了一个Alarm,adb logcat显示警报触发但它不会执行Receiver的OnReceive函数。

清单:

<receiver android:name=".AlarmReceiver" android:enabled="true">
    <intent-filter>
        <action android:name="com.companyname.APPNAME.SEND.REPORT"></action>
    </intent-filter>
</receiver>

警报创建:

        if (Exists(context)) return;
        AlarmManager alarmMgr = (AlarmManager)context.GetSystemService(Context.AlarmService);
        Intent intent = new Intent("com.companyname.APPNAME.SEND_REPORT");
        PendingIntent alarmIntent = PendingIntent.GetBroadcast(context, 1337, intent, PendingIntentFlags.CancelCurrent);

        Calendar calendar = Calendar.Instance;
        calendar.TimeInMillis = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        alarmMgr.SetInexactRepeating(AlarmType.RtcWakeup, calendar.TimeInMillis, 1000 * 10, alarmIntent);

接收者:

public class AlarmReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Classes.Log.Write("Reports alarm received.");
        PowerManager pm = (PowerManager)context.GetSystemService(Context.PowerService);
        PowerManager.WakeLock wl = pm.NewWakeLock(WakeLockFlags.Partial, "SendReports");
        wl.Acquire();

        Classes.Network.SendReportsAsync();

        wl.Release();
        Classes.Log.Write("Reports alarm finished.");
    }
}

ADB Logcat 日志:

07-23 11:08:46.723  1312  1863 V AlarmManager: Triggering alarm #0: 0 when =1595491710351 package =com.companyname.APPNAME operation =*walarm*:com.companyname.APPNAME.SEND_REPORT flags =0x0

接收器日志永远不会写入我的日志文件,也不会发送任何报告,这意味着接收器从未执行过。

提前致谢。

更新: 这是在我将 Intent 更改为 typeof(AlarmReceiver) 之后,这就是输出

07-23 17:43:20.616  1312  1863 V AlarmManager: Triggering alarm #0: 0 when =1595515400614 package =com.companyname.ReportOne operation =*walarm*:com.companyname.ReportOne/md5057b6bb0fb853ea7a7a76aecdac4ee0b.AlarmReceiver flags =0x0

AlarmReceiver 仍然不会执行

更新 2:

这是当前启动警报的代码

public static void Init(Context context)
    {
        if (Exists(context)) return;
        AlarmManager alarmMgr = (AlarmManager)context.GetSystemService(Context.AlarmService);
        Intent intent = new Intent(context, typeof(AlarmReceiver));
        PendingIntent alarmIntent = PendingIntent.GetBroadcast(context, 1337, intent, PendingIntentFlags.CancelCurrent);

        // Set the alarm to start at 7:00 a.m.
        Calendar calendar = Calendar.Instance;
        calendar.TimeInMillis = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        Classes.Log.Write(string.Format("Initializing Alarm, next alarm will fire at {0}",
            DateTimeOffset.FromUnixTimeMilliseconds(GetMilliseconds()).ToString("g")));

        alarmMgr.SetInexactRepeating(AlarmType.RtcWakeup, calendar.TimeInMillis, 1000 * 10, alarmIntent);
    }

【问题讨论】:

  • 自 Oreo 以来已禁止向(大多数)清单注册的接收器进行隐式广播。您需要使用明确的Intent 来代替;例如,new Intent(context, typeof(AlarmReceiver))(我认为语法是正确的;我不使用 Xamarin)。然后,您可以从 &lt;receiver&gt; 元素中删除 &lt;intent-filter&gt;
  • 那我还应该将接收器保留在清单中吗?顺便说一句,我应该把它留在那里以备不时之需吗? @MikeM。
  • 您现在究竟是如何创建Intent 的?另外,是的,&lt;receiver&gt; 仍然需要在清单中;它只是不需要&lt;intent-filter&gt;。没有必要为了向后兼容而保留它,因为明确的 Intents 一直有效,而且它总是应该这样做,即使你会看到很多很多使用隐式广播的例子,出于某种原因.不知道为什么。
  • 我已经更新了问题,这是新的 Intent 创建,顺便说一下 - 如问题中所述,警报被触发,但接收器未执行 也许这是一个命名空间和包的游戏? @MikeM。

标签: c# android xamarin.android alarmmanager android-alarms


【解决方案1】:

所以经过一些研究后,我意识到在 Xamarin 中您不应该从清单文件中注册您的接收器,Xamarin.Android 为此提供了一个属性。

[BroadcastReceiver(Enabled = true, Exported = false)]
public class AlarmReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Classes.Log.Write("Reports alarm received.");
        PowerManager pm = (PowerManager)context.GetSystemService(Context.PowerService);
        PowerManager.WakeLock wl = pm.NewWakeLock(WakeLockFlags.Partial, "SendReports");
        wl.Acquire();

        //Classes.Network.SendReportsAsync();

        wl.Release();
        Classes.Log.Write("Reports alarm finished.");
    }
}

【讨论】:

  • 您好,很高兴解决了这个问题!记得在有时间的时候标记答案,这将有助于其他人遇到同样的问题。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多