警报管理器提前触发但不设置毫秒

问题描述 投票:0回答:1
private void fireAlarmAt(int id,int year,int mnth,int day,int hour,int min,int sec) {
        AlarmManager alarmMgr;
        PendingIntent alarmIntent;
        alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
        if (Build.VERSION.SDK_INT >= 31)
            alarmIntent = PendingIntent.getBroadcast(getApplicationContext(),id,intent,PendingIntent.FLAG_IMMUTABLE);
        else
            alarmIntent = PendingIntent.getBroadcast(getApplicationContext(),id, intent, PendingIntent.FLAG_ONE_SHOT);
      
         // Set the alarm to start 
        Calendar calendar = Calendar.getInstance();
        
        Calendar calset = (Calendar) calendar.clone();
        calset.setTimeInMillis(System.currentTimeMillis());
        calset.set(Calendar.HOUR_OF_DAY, hour);
        calset.set(Calendar.MINUTE, min);
        calset.set(Calendar.SECOND, 0);
    
        Calendar calNow = (Calendar) calendar.clone();
        
        long remainTime  = calset.getTimeInMillis() - calNow.getTimeInMillis();
      
      
        alarmMgr.set(AlarmManager.RTC_WAKEUP,remainTime, alarmIntent);
        
    }
  • 如果剩余时间为 5 分钟,但在 20 秒内提前触发,则警报触发器很奇怪
  • 代码中任何错误的地方
  • 这里参数id用于创建多个Alarm
android alarmmanager
1个回答
0
投票

警报不准确。这是为了节省电池电量 - 它批量请求唤醒和使用 CPU,以便它们同时发生,从而减少消耗。所以,是的,提前几秒钟发生并不意外,并且在大多数用例中都是可以的。如果您需要更高的准确性,请使用 setExact 或 setExactAndAllowWhileIdle 而不是 set。

此外,任何消费者操作系统上都没有精确到毫秒的计时器。为此,您需要一个实时操作系统,它通常仅用于特定的嵌入式硬件用途。 Android 和 Linux 不是实时的,因此不会承诺将您的进程安排到毫秒。

© www.soinside.com 2019 - 2024. All rights reserved.