我已编写了每天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/

10-13 09:46
查看更多