Подтвердить что ты не робот

Android AlarmManager запускает каждые "круглые" 10 минут

Я использую AlarmManager в своем приложении следующим образом:

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, intent);

Что я ожидаю, чтобы вызвать тревогу где-то между 12 и 24 часами с каждого триггера. Однако поведение, особенно на устройствах HTC, довольно странно:

Каждый раз, когда срабатывает будильник, мы отправляем HTTP-запрос на наши серверы. На всех устройствах мы видим запросы, поступающие на сервер равномерно с течением времени, но на устройствах HTC есть шипы каждые "круглые" 10 минут (XX: 10, XX: 20,...): введите описание изображения здесь

Что может быть причиной этих всплесков? И почему это будет только на устройствах HTC?

4b9b3361

Ответ 1

Мы не можем видеть остальную часть вашего кода, но вы отменяете предыдущее намерение, как показано ниже:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, TimeAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, pendingIntent);

В противном случае это, вероятно, плохое управление AlarmManager от HTC, попробуйте эти различные исследования (это может показаться смешным, но лучше бросить вызов каждому элементу):

  • Добавьте немного задержки в System.currentTimeMillis(), а не только System.currentTimeMillis()
  • Используйте значение 43200000 (постоянное значение), а не AlarmManager.INTERVAL_HALF_DAY
  • Попробуйте этот с помощью Calendar
  • Попробуйте другие параметры для setInexactRepeating

Я не нашел никаких известных и перечисленных ошибок на эту тему. Если ваши расследования ничего не дают, вы, вероятно, ничего не сможете сделать. В этом случае вам нужно будет установить обходной путь для HTC, который не использует AlarmManager таким образом.

Ответ 2

Прежде всего отменить предыдущий alaram

private void cancelAlarm(Context context, Class aClass) {
        Intent intent = new Intent(context, aClass);
        PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarm.cancel(pintent);
    }

Затем создайте новый сигнал тревоги.

public static void setAlarmManager(Context context, Class aClass, String time) {
        Intent intent = new Intent(context, aClass);
        PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

//        alarm.cancel(pintent);

//        "auto_sync":"1","sync_time":"04:05"
        String timeArr[] = time.split(":");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArr[0]));
        calendar.set(Calendar.MINUTE, Integer.parseInt(timeArr[1]));

        alarm.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), INTERVAL, pintent);
    }

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

Ответ 3

Я вижу, что вы пробовали AlarmManager.RTC_WAKEUP, не могли бы вы попробовать AlarmManager.ELAPSED_REALTIME_WAKEUP?

Загрузите будильник, когда телефон включится с помощью

<receiver android:name=".YourBootReceiver"> 
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
        <action android:name="your.package.BOOT_FIRSTTIME"/>
    </intent-filter> 
</receiver>

Используйте user.package.BOOT_FIRSTTIME, когда пользователь активирует Alarm.

Затем настройте свой AlarmManager следующим образом:

24 часа в миллисекундах - 86400000

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 86400000, pendingIntent);

Ответ 4

Добавление интервала к второму параметру, т.е. triggerAtMillis помогло мне

alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis()+interval, interval, pendingIntent);

проверьте здесь для более подробной информации.