基于UnixTimestamp设置闹钟提前触发问题求助
问题诊断与修复方案
嘿,我瞅了下你的代码,马上发现了几个可能导致闹钟提前触发的问题,咱们一步步来解决:
1. 最明显的参数传错了!
你调用alarmManager.set()的时候,第二个参数居然传了broadcastReciever(你的广播接收器类),而不是你要设置的时间戳unixTimeStamp!这就相当于告诉系统用一个完全错误的时间值来触发闹钟,不出问题才怪呢。
先把这个错误修正,修正后的代码应该是这样:
private void setNotificationAlarm(long unixTimeStamp){ AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(ALARM_SERVICE); Intent intent = new Intent(getContext(), BroadcastReceiver.class); // 顺便提下,类名首字母大写是Java规范哦 PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, intent, 0); // 这里把第二个参数改成咱们的时间戳unixTimeStamp alarmManager.set(AlarmManager.RTC_WAKEUP, unixTimeStamp, pendingIntent); }
2. 确认时间戳的单位是否正确
另外一个很容易踩坑的点:Unix时间戳通常是以秒为单位的,但Android的AlarmManager需要的是毫秒级的时间戳(和System.currentTimeMillis()的单位一致)。
你给出的时间戳1563551362看起来就是秒级的,如果直接传给AlarmManager,系统会把它当成毫秒,那对应的时间是1970年的某个时刻,自然会立刻触发或者提前好多年触发。这种情况要把时间戳乘以1000转成毫秒:
alarmManager.set(AlarmManager.RTC_WAKEUP, unixTimeStamp * 1000L, pendingIntent);
3. 额外的优化建议(针对精确性)
如果你的应用需要闹钟精确触发,还要注意:从Android API 19开始,AlarmManager.set()会采用弹性调度(系统为了省电批量处理闹钟),可能会有几分钟的误差。如果要追求精确,建议用setExact()或者setExactAndAllowWhileIdle()(应对系统的Doze模式)。
最后再检查下你的广播接收器类名拼写,代码里的broadcastReciever应该是BroadcastReceiver(注意Receiver的正确拼写,首字母大写),避免系统找不到这个组件导致闹钟不触发或者报错。
内容的提问来源于stack exchange,提问作者aboodyAs
相关产品推荐
相关产品推荐

