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?
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()