我制作了一个日历,以便在每天晚上8点的特定时间显示吐司 但应用程序节目启动服务并在不同时间显示吐司。 像
8:00 pm
8:23 pm
8:30 pm
8:32 pm
8:50 pm
并且不会停止显示吐司
有什么不对?
这是我的Mainactivity.java代码
Intent alarmIntent = new Intent(MainActivity.this, MyService.class);
pendingIntent = PendingIntent.getService(MainActivity.this, 0, alarmIntent, 0);
setAlarm();
}
private void setAlarm() {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
/* Set the alarm to start at 8.00 PM */
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
//Add a day if alarm is set for before current time, so the alarm is triggered the next day
if (calendar.before(Calendar.getInstance())) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), pendingIntent);
}}
答案 0 :(得分:0)
注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。 targetSdkVersion早于API 19的旧应用程序将继续将所有警报(包括重复警报)视为完全警报。
修改强> 你警告不准确,这意味着系统不会在您设置00:800的确切时间内唤醒以满足您的请求,而是会将一些需要完成的操作分组,大约在您设置的时间,然后解雇它们所有这些都可以节省手机的电量,并且可以防止手机每隔几秒钟一次醒来。
您可以使用AlarmManager.set()
将您的来电替换为非重复通话,并自行处理重复,因为每次发出警报时都会计划下一次。
或者,如果您的闹钟触发不是时间关键的(它不一定非常精确),您可以保持原样。
答案 1 :(得分:0)
要获得精确警报而不是使用setRepeating,请使用setAndAllowWhileIdle 否则,如果您不需要精确计时,我建议您使用firebase工作调度员安排您的工作https://github.com/firebase/firebase-jobdispatcher-android