为什么我的 Android AlarmManager 代码不能正常工作?

Why is my Android AlarmManager code not working properly?

我的应用程序中有闹钟:

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.curentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 11);
        calendar.set(MINUTE, 11);

        Intent intent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = Pending.getBroadcast(this, 0, intent, 0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
    }
}

这是我的AlarmReceiver.class

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        System.out.println("ALARM: " + sdf.format(new Date()));
    }
}

在我的 AndroidManifest.xml 中有这条线

<receiver android:name=".main.AlarmReceiver" />

问题是闹钟在我设置的时间不响。我为

设置了闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 5);

然后在11:11:29报警。然后我设置闹钟

calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 20);

然后在11:26:29报警。然后我设置闹钟

calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 29);

然后闹钟在11:41:29报警。

就这样持续了一上午。但是,如果我替换此行

alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);

用这条线

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime()+10000), pendingIntent);

然后报警器在合适的10秒内完美报警

这是怎么回事?

根据文档,setInexactRepeating 在设计上并不准确。为了通过多次唤醒设备来减少电池消耗,它会在内部尝试同时触发多个警报,从而导致某些客户端的警报时间不准确。 https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,%20long,%20long,%20android.app.PendingIntent)