我已编写了每天5:22 am运行的警报代码。该代码在第一个时间间隔内运行良好,但在第二个时间间隔前24小时触发。
我已在MainActivity的onCreate()
方法中添加了警报代码,该代码在第一个间隔运行良好,但是在第一个间隔之后,如果我打开MainActivity,警报将再次触发并在打开MainActivity时继续触发。例如,如果我两次打开MainActivity,则警报触发两次。
我在这里也没有提及任何解决方案,但是它们不能像marmor's answer那样工作。
我还尝试检查警报是否使用FLAG_NO_CREATE标志设置,但仍然无法正常工作。
下面是我的代码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, ServiceReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 11111, intent, 0);
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
calSet.set(Calendar.HOUR_OF_DAY, 5);
calSet.set(Calendar.MINUTE, 11);
calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0);
if(calSet.compareTo(calNow) <= 0){
//Today Set time passed, count to tomorrow
calSet.add(Calendar.DATE, 1);
}
alarmMgr.cancel(alarmIntent);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, alarmIntent); //1000 * 60 * 1440
}
我正在记录服务运行到文本文件中的时间。
编辑:
目标SDK版本为22
并且根据科伦坡的建议,我检查了日期并检查了是否执行了if语句。如果执行if语句,我将在同一时间获得明天的日期。
我正在使用Moto E开发应用程序。
我已经在Google驱动器上上传了项目文件here。
最佳答案
您需要从服务上的onStartCommand函数返回START_NOT_STICKY。否则,您必须在作业完成后停止它。或者,您可以使用IntentService代替Service。警报正常。
public int onStartCommand(Intent intent, int flags, int startId){
try{
commitToFile("Start");
}catch (Exception e){}
try{
commitToFile("End");
}catch (Exception e){}
return START_NOT_STICKY;
}
您返回了0,即START_STICKY_COMPATIBILITY。第一次触发警报时,您的服务将启动并运行。并且当您重新启动applicaton时,您的服务也会重新启动,因为您没有停止它。如果返回START_NOT_STICKY-服务将不会重新启动。或者,如果您使用IntentService,则此服务会自动完成工作并自行完成。
关于java - 在第二个间隔完成之前触发AlarmManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32342762/