如何在 Xamarin Droid 项目中重复特定时间间隔的警报?
Posted
技术标签:
【中文标题】如何在 Xamarin Droid 项目中重复特定时间间隔的警报?【英文标题】:how to make Alarm repeats for particular time interval in Xamarin Droid project? 【发布时间】:2018-02-17 09:24:00 【问题描述】:使用 Xamarin Droid,我创建了一个警报应用程序。为特定时间设置警报效果很好。当我尝试在特定时间间隔内重复警报时,它无法在特定时间发出警报。即使应用程序处于睡眠状态,应用程序也需要发出警报。下面的代码是我在 Xamarin Droid 项目中尝试设置和重复警报的。请以正确的方式指导我以实现我的重复警报解决方案!。
设置特定时间的闹钟:
manager.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + 60 * 1000 * int.Parse(notifytime), pendingIntent);
我需要从闹钟响起每 15 分钟重复一次。
manager.SetRepeating(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime()+10, AlarmManager.IntervalFifteenMinutes, pendingIntent);
提前致谢。
【问题讨论】:
您如何检查警报没有响起(您是否正在以待处理的意图登录到 logcat)?您正在触发什么类型的待处理意图?同样Wakeup
仅唤醒 cpu,因此它可以运行您的待处理意图,它不会唤醒屏幕。
【参考方案1】:
为了让警报在设备处于睡眠状态时在正确的时间可靠地触发 android 上的操作,必须实现几个部分,并且它们都涉及在目标 PendingIntent 正在运行时保持唤醒锁。我假设您的 PendingIntent 指的是BroadcastReceiver
或Service
而不是Activity
,因为在计时器上运行活动通常没有用。如果您的 PendingIntent 的目标没有持有唤醒锁,则无法保证在调用警报时该操作会实际发生。 This 非常老的线程讨论了使用 AlarmManager 唤醒设备缺乏保证。
解决方案是确保 PendingIntent 的目标首先在设备上保持唤醒锁定。您必须做的第一件事是允许您的应用程序权限持有唤醒锁。这是通过向您的 AndroidManifest.xml 文件添加以下权限来完成的。
<uses-permission android:name="android.permission.WAKE_LOCK" />
谢天谢地,@jon-douglas 编写了一些 Xamarin 示例代码来演示这个here。虽然这可能会为您提供您想要的结果,但似乎最好的做法是不是直接调用 Service
,而是使用中介 WakefulBroadcastReceiver
为您启动服务. Android documentation for WakefulBroadcastReceiver 中有一个如何做到这一点的示例。
【讨论】:
【参考方案2】:改变这一行...
manager.SetRepeating(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime()+10, AlarmManager.IntervalFifteenMinutes, pendingIntent);
到
manager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(),15*60*1000, pintent);
也添加这个
<uses-permission android:name="android.permission.WAKE_LOCK" />
到您的 AndroidManifest.xml 文件中,正如#Avi Cherry 所说的那样!!
schedule a repeating alarm
【讨论】:
以上是关于如何在 Xamarin Droid 项目中重复特定时间间隔的警报?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xamarin 中为 android 添加工具栏,因为 ToolbarItem 不适用于 .droid?
xamarin 表单错误 Droid.Resource 不包含字符串的定义