首先,我知道关于这方面的其他问题,例如:scheduling alarm for every second in android 5.1或How to use Android AlarmManager with small intervals like 1 minute?
因此,它基本上说,这种行为的小间隔是由于系统优化的目的。但是什么是小呢?它说的是每隔几秒钟设置一次警报器。但是几分钟呢?同样的问题?什么时间间隔将开始行为更接近预定的时间?几个小时?几天?它们似乎讨论了使用setRepeating设置重复间隔。
所以这就是我在挣扎的地方。我试着每5分钟(300000毫秒)设置一次警报,这是否仍然太小?我正试图通过set,甚至setExact或setWindow来实现这一目标。在第一次警报触发后,我设置了300000 ms的新警报。下面是我最初设置的方式:
//initially somewhere I call:
IntervalScheduler.createAlarm(context!!, 300000)
...
//which is this:
object IntervalScheduler
{
fun createAlarm(ctx: Context, milliseconds: Long)
{
val intent = Intent(ctx, AlarmReceiver::class.java)
val alarmManager = ctx.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)
if (Build.VERSION.SDK_INT >= KITKAT)
{
// doesn't help
//alarmManager.setExact(AlarmManager.RTC_WAKEUP, milliseconds, 60000, pendingIntent)
// this doesn't help as well - trying to give it a window of 1 minute
alarmManager.setWindow(AlarmManager.RTC_WAKEUP, milliseconds, 60000, pendingIntent) // doesn't help
}
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, pendingIntent)
}
}
}
// this gets called fine
class AlarmReceiver: BroadcastReceiver()
{
override fun onReceive(context: Context?, intent: Intent?)
{
Log.i("NOTE","Notifying")
// create next alarm
IntervalScheduler.createAlarm(context!!, 300000)
}
}以下是生成的日志:
09-21 22:21:53.846 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:22:54.812 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:23:55.023 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:00.655 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:06.085 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:11.616 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:17.193 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:22.674 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:28.164 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:33.852 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:25:34.815 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:26:57.604 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:28:14.842 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:29:14.968 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:30:15.275 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:31:15.459 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:32:15.644 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:33:15.834 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:34:15.941 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:35:16.143 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:36:17.804 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:17.969 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:23.686 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:29.131 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:34.749 26982-26982/com.sykes I/NOTE: Notifying离这儿不到5分钟。事实上,它很少超过一分钟。就像最后4个电话是在同一分钟内发生的。系统有时会优化5分钟至6-5秒?
这还像预期的那样吗?如果设定为3600000小时(1小时)还是86400000小时(24小时),它会更接近预期吗?
发布于 2018-09-22 22:34:59
发现我做错了什么。我用警报类型调用set (和所有其他变体),并传递给它300000 (5分钟)。我没有意识到警报器应该在几毫秒内触发。我一直在想,从现在开始,等待的时间是毫秒。所以在此之前:
alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, pendingIntent)解决办法是:
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + milliseconds, pendingIntent)小心你。这并不意味着我能让它在短时间内正常工作。我把它做得很好--即使是很长的时间间隔。
PS。我不知道这对堆叠溢出是否有用。
https://stackoverflow.com/questions/52453116
复制相似问题