启动报警管理器的时间不正确
Icorrect time of starting Alarm Manager
我对警报管理器有疑问。我正在尝试设置在特定时间开始闹钟,但闹钟会在设置时间后 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 起警报传递不准确,请参阅 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()
我对警报管理器有疑问。我正在尝试设置在特定时间开始闹钟,但闹钟会在设置时间后 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 起警报传递不准确,请参阅 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()