我试图在用户选择的时间发出警报。然而,我注意到警报在选定的一分钟内永远不会消失。即如果用户从TimePicker对话框中选择8:30,则警报通常会在8:30分钟内某处触发,有时会在一分钟后触发。此外,有时警报根本不会发射。目标是更新当前警报,以便始终不创建新警报。我是Android闹钟服务的新手,所以我希望有人可以看看。这是一些代码:
在我的onCreate
中调用此方法private void initAlarmService() {
calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
ComponentName receiver = new ComponentName(getContext(), AlarmReceiver.class);
pm = getContext().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
alarmIntent = new Intent(getContext(), AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(getContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
manager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
}
选择时间时会调用此方法:
private void setTime(int hour, int minute) {
if(sharedPreferences.contains("ALARM_PREF")){
manager.cancel(pendingIntent);
}
sharedPreferences.edit().putString("ALARM_PREF", ""+hour + ":" +minute).apply();
//set date object time to picker value
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
//interval = 1000 * 60 * 60 * 24
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTime().getTime(), interval, pendingIntent);
//This just outputs to a textview
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
time = sdf.format(calendar.getTime().getTime());
alarmText.setText(time);
calendar.setTimeInMillis(System.currentTimeMillis());
}
答案 0 :(得分:1)
如果您在API 19+设备上看到了您所描述的行为,那么AlarmManager
documentation中的这条说明可能会解释原因:
注意:从API 19(KITKAT)开始,警报传递是不准确的:操作系统 将移动警报以最小化唤醒和电池使用。那里 是支持需要严格交付的应用程序的新API 担保;请参阅setWindow(int,long,long,PendingIntent)和 setExact(int,long,PendingIntent)。应用程序 targetSdkVersion早于API 19将继续看到 以前的行为,其中所有警报都在何时传递 请求。
在您的情况下,您需要切换到使用setExact()
。遗憾的是,没有setExactRepeating()
,所以当您收到第一次警报时,您必须再次手动设置它。