我写了一个警报代码,每天早上5:22运行。代码在第一个时间间隔内正常工作,但在第二个时间间隔24小时之前触发。
我在MainActivity的onCreate()
方法中添加了警报代码,代码在第一个间隔运行完美但在第一个间隔后如果我打开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
根据kolombo的建议,我检查了日期并检查了我的if语句是否已执行。 if语句被执行,我明天会得到同一时间。
我使用Moto E开发应用程序。
我已在google drive上传了项目文件here。
答案 0 :(得分:3)
您需要从服务上的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。当您的服务首次启动并运行时,您的警报会触发。当您重新启动应用程序时,您的服务也会重新启动,因为您没有停止它。如果您返回START_NOT_STICKY - 服务将不会重新启动。或者,如果您使用IntentService,此服务可以完成工作并自动完成。
答案 1 :(得分:1)
每当您的MainActivity启动onCreate()被调用时,您最终会得到警报通知的多个实例。
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
将上面的代码放在if
条件中,当你再次onCreate调用时,将结果保存在SharedPreferences(Ex:calSet)中,只需从getSharedPreferences获取值并与calNow进行比较。