2013-03-21 2 views
0

Для этой части моего кода у меня есть расписание, которое имеет логическое значение для каждого дня недели. Если этот день верен, то на этот день есть тревога начала и конца, и эти тревоги должны срабатывать каждую неделю в этот день. Он работает, если я устанавливаю будильник позже в текущий день во время тестирования или через день в неделю, но в любое другое время, как в день недели, который уже произошел, или если я установил либо будильник для более раннего в день, чем при тестировании, по какой-то причине срабатывают оба сигнала тревоги. Вот код для создания сигнала тревоги:AlarmManager не срабатывает должным образом

public void createNewAlarm(int i) //int correlates to position in list 
    { 
     for(int j = 0; j < 7; j++) 
     { 
      if(tempmainfrag.mainObjectList.returnSchedule(i).returnDays()[j]) //if this day of the week has an alarm 
      { 
       ////beginning alarm stuff//// 
       int alarmid = (int)System.currentTimeMillis(); //creates unique id for the alarm attached to the object 

       int adjustedday = j+2; //makes time for DAY_OF_WEEK where sunday = 1, monday = 2, etc. 
       if (adjustedday == 8) 
        adjustedday = 1; 
       Calendar startcal = Calendar.getInstance(); 
       startcal.set(Calendar.DAY_OF_WEEK, adjustedday); 
       startcal.set(Calendar.HOUR_OF_DAY, tempmainfrag.mainObjectList.returnSchedule(i).returnTimes()[0]); 
       startcal.set(Calendar.MINUTE, tempmainfrag.mainObjectList.returnSchedule(i).returnTimes()[1]); 
       startcal.set(Calendar.SECOND, 0); 

       Intent intent = new Intent(this, SilenceHandler.class); 
       intent.putExtra("alarm_message", "Start!"); 
       intent.putExtra("vibratemode", tempmainfrag.mainObjectList.returnSchedule(i).returnVibrate()); 
       intent.setData((Uri.parse(String.valueOf(alarmid)))); 
       PendingIntent pendintent = PendingIntent.getBroadcast(this, alarmid, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
       tempmainfrag.mainObjectList.returnSchedule(i).addStartPendIntent(alarmid); 

       AlarmManager alarmman = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmman.setRepeating(AlarmManager.RTC_WAKEUP, startcal.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendintent); 
       //120000 means every 2 mins 

       ////ending alarm stuff//// 
       if(tempmainfrag.mainObjectList.returnSchedule(i).nextday) //if end alarm ends on next day instead of same day 
       { 
        adjustedday++; 
        if (adjustedday == 8) 
         adjustedday = 1; 
       } 

       alarmid = (int)System.currentTimeMillis(); //creates unique id for the alarm attached to the object 

       Calendar endcal = Calendar.getInstance(); 
       endcal = Calendar.getInstance(); 
       endcal.set(Calendar.DAY_OF_WEEK, adjustedday); 
       endcal.set(Calendar.HOUR_OF_DAY, tempmainfrag.mainObjectList.returnSchedule(i).returnTimes()[2]); 
       endcal.set(Calendar.MINUTE, tempmainfrag.mainObjectList.returnSchedule(i).returnTimes()[3]); 
       endcal.set(Calendar.SECOND, 0); 

       Intent intent2 = new Intent(this, SilenceHandler.class); 
       intent2.putExtra("alarm_message", "End!"); 
       intent2.putExtra("vibratemode", tempmainfrag.mainObjectList.returnSchedule(i).returnVibrate()); 
       intent2.setData((Uri.parse(String.valueOf(alarmid)))); 
       PendingIntent pendintent2 = PendingIntent.getBroadcast(this, alarmid, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 
       tempmainfrag.mainObjectList.returnSchedule(i).addEndPendIntent(alarmid); 

       AlarmManager alarmman2 = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmman2.setRepeating(AlarmManager.RTC_WAKEUP, endcal.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendintent2); 
       //120000 means every 2 mins 
      } 
     } 

    } 

И я не уверен, если это уместно, или нет, но вот код для удаления сигнала тревоги, хотя эта часть, кажется, работает нормально, насколько мне известно:

public void deleteAlarm(int i) 
{ 
    AlarmManager alarmman = (AlarmManager)getSystemService(ALARM_SERVICE); 

    Log.i("mydebug","Deleting alarm: The pending intent list null/not null is: " + tempmainfrag.mainObjectList.returnSchedule(i).startAlarmList);//.pendintentlist.size()); 

    //delete start alarms 
    if (tempmainfrag.mainObjectList.returnSchedule(i).startAlarmList != null) 
    { 
     Log.i("mydebug","Cancelling start alarm..."); 
     //cancels all alarms 
     for (int j = 0; j < tempmainfrag.mainObjectList.returnSchedule(i).startAlarmList.size(); j++) 
     { 
      Intent intent = new Intent(this, SilenceHandler.class); 
      intent.putExtra("starttime",tempmainfrag.mainObjectList.returnSchedule(i)); 
      intent.putExtra("alarm_message", "Start!"); 
      intent.setData((Uri.parse(String.valueOf(tempmainfrag.mainObjectList.returnSchedule(i).startAlarmList.get(j))))); 
      Log.i("mydebug","Alarm number " + (j+1) + " being cancelled."); 

      PendingIntent pendintent = PendingIntent.getBroadcast(this, tempmainfrag.mainObjectList.returnSchedule(i).startAlarmList.get(j), intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      alarmman.cancel(pendintent); 
     } 
    } 

    //delete end alarms 
    if (tempmainfrag.mainObjectList.returnSchedule(i).endAlarmList != null) 
    { 
     Log.i("mydebug","Cancelling end alarm..."); 
     //cancels all alarms 
     for (int j = 0; j < tempmainfrag.mainObjectList.returnSchedule(i).endAlarmList.size(); j++) 
     { 
      Intent intent = new Intent(this, SilenceHandler.class); 
      intent.putExtra("endtime",tempmainfrag.mainObjectList.returnSchedule(i)); 
      intent.putExtra("alarm_message", "End!"); 
      intent.setData((Uri.parse(String.valueOf(tempmainfrag.mainObjectList.returnSchedule(i).endAlarmList.get(j))))); 
      Log.i("mydebug","Alarm number " + (j+1) + " being cancelled."); 

      PendingIntent pendintent = PendingIntent.getBroadcast(this, tempmainfrag.mainObjectList.returnSchedule(i).endAlarmList.get(j), intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      alarmman.cancel(pendintent); 
     } 
    } 

    //deletes alarm intents from object 
    tempmainfrag.mainObjectList.returnSchedule(i).deleteIntents(); 
} 

ответ

1

В конце концов выяснилось, что исправление после дальнейшего понимания системы AlarmManager. Добавление этих строк было исправлено:

Calendar checkdate = Calendar.getInstance(); //used so that alarm set to earlier in the week doesnt go off 
if (startcal.before(checkdate)) //see if alarm is for earlier in week 
    { 
     startcal.add(Calendar.DATE, 7); //makes alarm trigger next time it becomes that day instead of immediately 
    } 
Смежные вопросы