2015-04-09 4 views
2

Я установил диспетчер аварийных сигналов, который должен запускать ожидающее намерение в определенное время суток.Ожидание намерения, вызванное диспетчером аварийных сигналов, похоже, сразу срабатывает

Я поместил код в метод onCreate() моей основной деятельности, так как считал, что это лучшее место для его размещения?

Ниже приведен код:

Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 

    final Intent updateIntent = new Intent(Intent.ACTION_MAIN, null); 
    updateIntent.addCategory(Intent.CATEGORY_HOME); 
    final ComponentName cn = new ComponentName(
      "com.example.myotherapp", 
      "com.example.myotherapp.MainActivity"); 
    updateIntent.setComponent(cn); 
    updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, updateIntent, 0); 

    AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); // launch at 4am, then every day (24 hours) 

ТРЕВОГИ менеджер работает, я могу видеть, что огонь в указанное время, но также кажется, что В ожидании Намерение обжигают, как только эта база приложений начинается.

Что вызывает намерение стрелять сразу? И как я могу остановить это от этого?

+0

Прежде всего проверить, если ваш 'Alarm' вы набор был добавлен, как вы ожидали В«командной строки»вставьте этот' ADB оболочки dumpsys alarm> alarms.txt'. И выполните поиск в файле alarms.txt с вашим именем пакета. Вы shold найти что-то вроде 'RTC_WAKEUP # 13: Сигнализация {41e7daf8 типа 0 your.package.name} типа = 0 при = + 8h42m36s649ms repeatInterval = 10800000 Count = 1 операции = PendingIntent {41c6e8b8: PendingIntentRecord {41e7e768 your.package .name broadcastIntent}} ' –

ответ

2

Ваша проблема здесь:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 

calendar.getTimeInMillis() возвращает временную метку, что перед текущей временной метки (System.currentTimeMillis()), так что почему сигнализации пожара сразу.

Чтобы устранить проблему:

long triggerTime = calendar.getTimeInMillis(); 
if (triggerTime <= System.currentTimeMillis() + 3000) 
{ 
    // 3 Second distance 

    calendar.add(Calendar.DATE, 1); // Add 1 day --> Trigger 1 day later from now 
} 

Если вы всегда хотите, чтобы начать свой будильник на 4 утра 1 день позже. Вы можете удалить состояние и делать так:

calendar.add(Calendar.DATE, 1); // Add 1 day --> Calendar time will be tomorrow 4am 

И

alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); 
+0

Для чего нужна 3-секундная задержка? –

+0

Это только для случая calendar.getTimeInMillis() очень близко к System.currentTimeMillis() SO, вы не хотите запускать Alarm прямо сейчас. Правильно? – Loc

+0

Вы можете удалить 3 секунды. Это тоже сработает. – Loc

1

Вы устанавливаете будильник для запуска в 4 часа утра сегодня, а не завтра. Поскольку это время уже прошло, будильник запускается немедленно.

+0

Календарь установлен в 4:00, не указан день. Если вы устанавливаете будильник своего телефона на 8 утра по утрам, как раз перед тем, как лечь спать, это сразу же исчезнет, ​​потому что 8 утра уже прошло? Нет, нет. –

+0

'calendar.getInstance()' возвращает текущую дату и время. Когда вы меняете время до 4 утра, вы меняете время, но не на дату. Приложение системной тревоги также изменяет дату (он автоматически устанавливает завтра, если время уже прошло). – StenSoft

+0

@StenSoft был прав, поэтому я выдвигаюсь, чтобы уравновесить неоправданное понижение. – Sebastiano

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