You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AlarmManager setInexactRepeating仅触发一次问题求助

问题分析与修复方案

嘿,我一眼就瞅到你代码里的关键问题啦,这就给你拆解清楚:

核心错误:重复间隔参数传错了

AlarmManager.setInexactRepeating()的第三个参数是两次触发之间的间隔毫秒数,而不是下一次触发的绝对时间!你现在传的System.currentTimeMillis() + 5000是一个动态的未来时间戳,AlarmManager会把它当成重复间隔——这个值会随着当前时间不断变大,导致下一次触发的时间被算到很久以后,自然只会执行一次。

次要问题:PendingIntent的Flag不符合新版本要求

在Android 12(API 31)及以上,创建PendingIntent必须指定FLAG_IMMUTABLE或FLAG_MUTABLE,使用旧的0作为flag不仅可能抛出异常,还可能导致PendingIntent无法正确更新,间接影响重复触发逻辑。

修正后的代码

private fun register30MinSchedule() {
    val alarmMgr = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val alarmIntent = Intent(this, AlarmReceiver::class.java).let { intent ->
        // 根据需求选择FLAG_IMMUTABLE或FLAG_MUTABLE,这里用IMMUTABLE更安全(如果不需要修改intent内容)
        PendingIntent.getBroadcast(
            applicationContext,
            LocationTrack_Service_ID,
            intent,
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        )
    }

    // 计算首次触发时间(立即触发),重复间隔设为5000毫秒(5秒)
    val firstTriggerTime = System.currentTimeMillis()
    val repeatInterval = 5000L

    alarmMgr?.setInexactRepeating(
        AlarmManager.RTC_WAKEUP,
        firstTriggerTime,
        repeatInterval,
        alarmIntent
    )
}

额外注意事项

  • 如果你需要精确的重复触发(比如严格每5秒一次),setInexactRepeating可能满足不了,因为它是为了省电会批量处理闹钟。这种情况下可以考虑使用setExactAndAllowWhileIdle,然后在AlarmReceiver里重新设置下一次闹钟(但要注意不要过度使用,避免耗电)。
  • 记得在AndroidManifest.xml里注册你的AlarmReceiver,否则广播接收不到哦:
<receiver android:name=".AlarmReceiver" />

内容的提问来源于stack exchange,提问作者Mustansar Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:59:07