首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AlarmManager的运行间隔太短,无法预测。接近预期时间的最小合理间隔是多少?

Android AlarmManager的运行间隔太短,无法预测。接近预期时间的最小合理间隔是多少?
EN

Stack Overflow用户
提问于 2018-09-22 02:59:34
回答 1查看 471关注 0票数 0

首先,我知道关于这方面的其他问题,例如:scheduling alarm for every second in android 5.1How to use Android AlarmManager with small intervals like 1 minute?

因此,它基本上说,这种行为的小间隔是由于系统优化的目的。但是什么是小呢?它说的是每隔几秒钟设置一次警报器。但是几分钟呢?同样的问题?什么时间间隔将开始行为更接近预定的时间?几个小时?几天?它们似乎讨论了使用setRepeating设置重复间隔。

所以这就是我在挣扎的地方。我试着每5分钟(300000毫秒)设置一次警报,这是否仍然太小?我正试图通过set,甚至setExactsetWindow来实现这一目标。在第一次警报触发后,我设置了300000 ms的新警报。下面是我最初设置的方式:

代码语言:javascript
复制
//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)
    }
}

以下是生成的日志:

代码语言:javascript
复制
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小时),它会更接近预期吗?

EN

回答 1

Stack Overflow用户

发布于 2018-09-22 22:34:59

发现我做错了什么。我用警报类型调用set (和所有其他变体),并传递给它300000 (5分钟)。我没有意识到警报器应该在几毫秒内触发。我一直在想,从现在开始,等待的时间是毫秒。所以在此之前:

代码语言:javascript
复制
alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, pendingIntent)

解决办法是:

代码语言:javascript
复制
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + milliseconds, pendingIntent)

小心你。这并不意味着我能让它在短时间内正常工作。我把它做得很好--即使是很长的时间间隔。

PS。我不知道这对堆叠溢出是否有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52453116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档