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
相关产品推荐
相关产品推荐

