告警管理器启动时间不正确



我的闹钟管理器有问题。我想在特定的时间设置启动闹钟,但闹钟在设定时间后2秒启动。下面是我设置闹钟的代码:

//setting alarm by clicking "add alarm"
        addAlarm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //initializing alert dialog with time picker
                final AlertDialog.Builder alert = new AlertDialog.Builder(Events.this);
                final TimePicker timer = new TimePicker(Events.this);
                alert.setMessage(R.string.choose_time);
                alert.setTitle(R.string.set_alarm);
                alert.setView(timer);
                alert.setPositiveButton("Apply", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //getting set time
                        int hour = timer.getHour();
                        int minute = timer.getMinute();
                        //getting alarm service
                        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                        //creating intent for switching to AlarmReceiver.class
                        Intent intent = new Intent(Events.this, AlarmReceiver.class);
                        SimpleDateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
                        //getting full date with hours and minutes
                        String alarmTime = selectedDate + " " + hour + ":" + minute;
                        //parsing date
                        try {
                            alarmDate = formatter.parse(alarmTime);
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        //creating pending intent
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(Events.this,
                                8452, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                        //setting alarm
                        alarmManager.set(RTC_WAKEUP,alarmDate.getTime(), pendingIntent);
                        //info about time set
                        Snackbar.make(bottomRL, "Alarm set in " + hour + ":" + minute,
                                Snackbar.LENGTH_LONG).show();
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                    }
                });
                alert.show();
            }
        });

这是我的接收器:

public class AlarmReceiver extends BroadcastReceiver {
    public AlarmReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, R.string.alarm_message, Toast.LENGTH_LONG).show();
            Vibrator vibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(2000);
    }
}
有谁能帮我解决这个问题吗?

这是因为自API 19以来,警报传递是不精确的,见这里。为了节省电池,操作系统会同时将警报切换为多个。如果你真的想把闹钟精确到秒,你可以使用alarmManager.setExact()

最新更新