Search code examples
androidbroadcastreceiveralarmmanager

Icorrect time of starting Alarm Manager


I have a problem with Alarm Manager. I'm trying to set starting alarm on specific time, but alarm starting in 2 seconds after setting time. Here's my code for setting alarm:

//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();
            }
        });

And here's my Receiver:

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);
    }
}

Can anybody help me to solve problem,pls?


Solution

  • Thats because since API 19 the alarm delivery is inexact, see here. The OS will shift the alarms to fire multiple at the same time in order to save battery. If you really want to set your alarm exact to the second, you could use alarmManager.setExact()