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);
}
警报不准确。这是为了节省电池电量 - 它批量请求唤醒和使用 CPU,以便它们同时发生,从而减少消耗。所以,是的,提前几秒钟发生并不意外,并且在大多数用例中都是可以的。如果您需要更高的准确性,请使用 setExact 或 setExactAndAllowWhileIdle 而不是 set。
此外,任何消费者操作系统上都没有精确到毫秒的计时器。为此,您需要一个实时操作系统,它通常仅用于特定的嵌入式硬件用途。 Android 和 Linux 不是实时的,因此不会承诺将您的进程安排到毫秒。