Android AlarmManager第二天未触发警报
我有一个闹钟管理器,我想每天早上6点启动它。我在应用程序首次启动时调用类通知,因此,它会在每天早上6点(重复)设置一个重复警报 当用户在早上6点到9点安装(并第一次运行应用程序)时,alarm manager工作正常,但是如果用户在早上9点之后第一次运行应用程序,我应该添加一天,并在第二天早上6点触发警报。这样做(将日期改为第二天),警报会在晚上10点左右随机触发(这是一个巨大的差异)。这是我的密码“Android AlarmManager第二天未触发警报,android,alarmmanager,Android,Alarmmanager,我有一个闹钟管理器,我想每天早上6点启动它。我在应用程序首次启动时调用类通知,因此,它会在每天早上6点(重复)设置一个重复警报 当用户在早上6点到9点安装(并第一次运行应用程序)时,alarm manager工作正常,但是如果用户在早上9点之后第一次运行应用程序,我应该添加一天,并在第二天早上6点触发警报。这样做(将日期改为第二天),警报会在晚上10点左右随机触发(这是一个巨大的差异)。这是我的密码“ 公共通知(上下文){ this.context=context; Intent appstar
公共通知(上下文){
this.context=context;
Intent appstart=新Intent(上下文,appstartreceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(上下文,0,appstart,PendingIntent.FLAG_UPDATE_CURRENT);//用于早晨的appstart
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
Calendar currentCal=Calendar.getInstance();
Calendar startapp=Calendar.getInstance();//用于早上启动应用程序
startapp.set(日历小时/天,6);
startapp.set(日历分钟,0);
startapp.set(日历秒,0);
长currentTime=currentCal.getTimeInMillis();
int diff=(int)(currentTime startapp.getTimeInMillis())/(1000*60*60);
如果(diff用下面的代码替换您的代码…这将在每天早上6点触发。它可能会帮助您
public void notification(Context context) {
Intent intent = new Intent(this, appstartreceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 99, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long startUpTime = calendar.getTimeInMillis();
// To avoid firing the alarm if the time is passed while setting
if (System.currentTimeMillis() > startUpTime) {
startUpTime = startUpTime + 24 * 60 * 60 * 1000;
}
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startUpTime, 24 * 60 * 60 * 1000, pendingIntent);
}
试试Commonware的wakeful intent服务,它可能会有所帮助
public class DailyListener implements AlarmListener {
public void scheduleAlarms(AlarmManager mgr, PendingIntent pi, Context context) {
// every day at scheduled time
Calendar calendar = Calendar.getInstance();
// if it's after or equal 6 am schedule for next day
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 6) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
}
你可以试着增加一天
if(calendar.before(calendar.getInstance())){
calendar.add(calendar.DAY/u/u月,1);
}
..//您的代码
这样,它每天都会在设定的时间触发。我没有得到你的else部分。如果你想在每天早上6点设置重复警报,那么alarmManager.setRepeating(alarmManager.RTC_WAKEUP,startapp.getTimeInMillis(),1000*24*60*60,pi);就足够了。这样做,当用户在下午1点安装应用程序时,android会将闹钟安排在第二天下午1点而不是6点!这是有问题的!不,它只会在6点启动…我想你是这样测试的…在下午1点运行应用程序后,你将设备的日期更改为第二天,然后你的闹钟会在那时启动…是吗是吗?确切地说,我是在下午1点安装的。将设备的日期改为第二天早上5点等了一分钟,然后改为早上6点,再改为早上7点,最后改为下午1点!这是唯一一次出现通知谢谢你的回复。我已经尝试了该代码,它给了我与以前相同的问题。我可能应该在不同的时间尝试它租用手机或在模拟器中。再次感谢
public class DailyListener implements AlarmListener {
public void scheduleAlarms(AlarmManager mgr, PendingIntent pi, Context context) {
// every day at scheduled time
Calendar calendar = Calendar.getInstance();
// if it's after or equal 6 am schedule for next day
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 6) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
}