2015-07-25 2 views
0

Ниже приведен код моего метода MainActivity onCreate(), в котором я установил будильник для запуска службы ScheduleAlarm сразу и только один раз. sPrefs - объект SharedPreference, который заботится об установке этого сигнала тревоги только один раз. Сервис ScheduleAlarm - это IntentService, который отлично срабатывает.Настройка тревоги из другого сигнала тревоги с использованием класса AlarmManager, который не срабатывает правильно

if(sPrefs.getBoolean("SettingAlarmForFirstTime",true)) { 
     //Creating alarm for showing notifications. 
     Calendar calendar = Calendar.getInstance(); 
     //calendar.setTimeInMillis(System.currentTimeMillis()); 
     //calendar.set(Calendar.HOUR_OF_DAY, 8); 

     Intent intent = new Intent(MainActivity.this, ScheduleAlarms.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);//Use AlarmManager.INTERVAL_DAY instead of int number here. 
     editor.putBoolean("SettingAlarmForFirstTime", false); 
     editor.commit(); 
    } 

Теперь это мой сервисный класс ScheduleAlarms. Когда эта служба запущена по методуHandleIntent(), вызывается из того, где я вызываю метод setWeeklyAlarms(). Теперь моя проблема изнутри этого метода. Я хочу установить 7 аварийных сигналов для полной недели на основе таймингов, которые я получу от вызова сервера API. Сейчас я не могу даже полностью выполнить один сигнал. Тревога, которую я устанавливаю, запускается после 3-секундной задержки, которая вызовет другую услугу с именем NotificationService, но аварийные сигналы запускаются немедленно, вместо того, чтобы ждать 3 секунды. Пожалуйста, проанализируйте и скажите мне, почему это происходит.

public class ScheduleAlarms extends IntentService { 
private boolean notificationsEnabled = true; 
private String notificationTimings = ""; 

public ScheduleAlarms() { 
    super("ScheduleAlarms"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    setWeeklyAlarm(); 
} 

private void setWeeklyAlarm() { 
    Intent i = new Intent(ScheduleAlarms.this, NotificationService.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getService(ScheduleAlarms.this, 10001, i, 0); 
    AlarmManager alarmManager = (AlarmManager) ScheduleAlarms.this.getSystemService(Context.ALARM_SERVICE); 

/* Установка этого alarmManager разжигать тревогу после задержки 3 минуты, но эта тревога увольняют немедленно */

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 3*60*1000, pendingIntent); 


} 

}

+0

проверить мой ответ ниже. Полный код находится здесь: https://github.com/Shiza1aas/dailyQuranVerses/blob/master/app/src/main/java/com/example/shiza/dailyquranverses/MainActivity.java – learner

ответ

1

Изменить следующую строку:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 3*60*1000, pendingIntent); 

до:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis() + 3 * 60 * 1000, 3 * 60 * 1000, pendingIntent); 

Сигнализация срабатывает сразу же, потому что

AlarmManager.ELAPSED_REALTIME_WAKEUP + 0, ...

Таким образом, первый раз, он срабатывает после 0 секунд. Чтобы изменить это, вам нужно добавить некоторое время здесь.

AlarmManager.ELAPSED_REALTIME_WAKEUP + time 

И, также следует повторять, так что вам нужно использовать setRepeating.

Примечание: 3 * 60 * 1000 == 3 minutes, not 3 seconds

+0

Спасибо за быстрый ответ, проверяю это из. – FingerSmith

+0

Ваш прием .. Дайте мне знать, работает ли это или нет? – learner

+0

Он работает .. Спасибо. Еще одна вещь, которую я пытаюсь достичь, - это то, что я хочу установить будильник в течение недели, где каждый день имеет свои собственные тайминги, которые я получаю, делая вызов сервера. Сервер возвращает строку в форме «0,08: 00; 1,09: 00; 2,18: 30; 3,08: 00; 4,08: 45; 5,09: 45; 5,10: 00 " где ; является разделителем, а подстрока, подобная первой 0,08: 00, означает 0-> воскресенье 08-> Час дня и 00-> Минуты. Теперь, какую логику я должен реализовать? – FingerSmith