1

Я пытаюсь реализовать будильник, поэтому мое приложение имеет 2 действия: основной (где пользователь устанавливает будильник) и «звонок», который отображается, когда тревога фактически срабатывает. Вот как я посылаю намерение для AlarmManager назвать «звон» окна:AlarmManager выполняет мой PendingIntent немедленно, а не ждет некоторое время

public void scheduleAlarm(View view) { 
    Intent intent = new Intent(this, WakeUp.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    PendingIntent wakeUp = PendingIntent.getActivity(this, 123, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) this.getSystemService(this.ALARM_SERVICE); 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calculateMillis(), wakeUp); // setExact is pretty much made for setting alarms anyway 
} 

private long calculateMillis() { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR, hour); 
    cal.set(Calendar.MINUTE, minute); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTimeInMillis() - Calendar.getInstance().getTimeInMillis(); 
} 

В моем манифесте я следующее:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".WakeUpWithMath" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".WakeUp" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:label="@string/title_activity_wake_up" 
     android:theme="@style/FullscreenTheme" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
     </intent-filter> 

    </activity> 
</application> 

Я проверил это несколько раз и с разными значениями calculateMillis (даже высмеивается, чтобы возвратить 30000), но результат всегда один и тот же: сразу после вызова alarmManager.setExact он отображает активность «звонка» и не дожидается времени, чтобы пройти сначала.

Что я пропустил? Является ли манифест неправильным? мне нужно использовать тег <receiver>? если да, то как его настроить?

ответ

3

setExact использует абсолютное время, а не относительное время. Используйте время, возвращенное cal.getTimeInMillis() без вычитания текущего времени.

+0

, к сожалению, он теперь вообще не запускается, любая идея, что еще может быть неправильным? – niralittle

+0

@niralittle. Вероятно, вы слишком долго вложили время в будущее. «Календарь» использует локальное время, если не задан другой часовой пояс. – StenSoft

+0

в принципе, если я правильно понял, он запускал его сразу, потому что время было меньше, чем сейчас, и такое поведение ожидается, но теперь .. может быть, локаль или ... что-то конкретное, на что я должен смотреть? – niralittle

Смежные вопросы