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

Периодичность выполнения задачи (один раз в день/раз в неделю)

Я хочу запускать некоторую задачу (например, получать страницу новостей веб-сайта) периодически (один раз в неделю/день), даже если мое приложение закрыто. Является ли это возможным?

4b9b3361

Ответ 1

Да, вам нужно посмотреть AlarmManager, чтобы настроить повторный "Тревога". Это лучше для аккумулятора на устройстве, так как в отличие от обслуживания он не работает постоянно в фоновом режиме. Тревога запускает широковещательный приемник, который будет выполнять ваш пользовательский код.

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

Хороший пример можно найти в следующем сообщении SO:

Пример диспетчера аварийных сигналов

Update

Новые функции были добавлены в Android. Если вы читаете это, я бы посоветовал вам теперь взглянуть на GcmNetworkManager. Это оптимизирует время работы от батареи и работает до леденца. Для Lollipop вы можете использовать JobScheduler. Я бы посоветовал использовать эти классы над AlarmManager.

Ответ 2

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

Пример:

PeriodicTask task = new PeriodicTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_PERIODIC)
        .setPeriod(5L)
        .build();

mGcmNetworkManager.schedule(task);

Ответ 3

В качестве альтернативы я сравниваю текущую неделю:

Calendar cal = Calendar.getInstance();
int currentWeekOfYear = cal.get(Calendar.WEEK_OF_YEAR);

SharedPreferences sharedPreferences= this.getSharedPreferences("appInfo", 0);
int weekOfYear = sharedPreferences.getInt("weekOfYear", 0);

if(weekOfYear != currentWeekOfYear){
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("weekOfYear", currentWeekOfYear);
    editor.commit();
    // Your once a week code here
}

Я не сторонник этого лучше, чем решение Alarm. Я просто показываю другой подход.