警报应用程序不准确

Alarm app is not accurate

我正在为 android 创建一个闹钟应用程序,出于某种原因,我的闹钟总是有 20-60 秒的延迟。我不知道为什么会这样,因为我对 API 19+

使用 setExact() 方法

我的代码:

private void setAlarm() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mHour = mTimePicker.getHour();
        mMinutes = mTimePicker.getMinute();
    } else {
        mHour = mTimePicker.getCurrentHour();
        mMinutes = mTimePicker.getCurrentMinute();
    }

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, mHour);
    calendar.set(Calendar.MINUTE, mMinutes);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent alarmIntent = new Intent(EditAlarm.this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(EditAlarm.this, 0, alarmIntent, 0);


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    }

}

报警接收器

public class AlarmReceiver extends WakefulBroadcastReceiver {

public AlarmReceiver() {
}

@Override
public void onReceive(final Context context, Intent intent) {

    Toast.makeText(context, "Alarm works", Toast.LENGTH_LONG).show();
    Intent alarmIntent = new Intent(context, AlarmActivity.class);
    alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(alarmIntent);
}

报警Activity

public class AlarmActivity extends AppCompatActivity {
private Vibrator mVibrator;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alarm);
    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


    // The ringing effects
    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null) {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(this, alarmUri);
    ringtone.play();
    mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
    long[] pattern = { 0, 300, 200, 300, 100, 100 };
    mVibrator.vibrate(pattern, 0);

    // UI
    Button stopButton = (Button) findViewById(R.id.finishButton);
    stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                    mVibrator.cancel();
                    finish();
        }
    });
}

我做错了什么?提前致谢 ;)

要解决此问题,您还需要设置秒数。您需要将其设置为零才能在指定的分钟数到达时触发它:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, mHour);
calendar.set(Calendar.MINUTE, mMinutes);
calendar.set(Calendar.SECOND, 0);