Периодическое выполнение задания (раз в день / раз в неделю) - PullRequest
41 голосов
/ 23 декабря 2011

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

Ответы [ 3 ]

49 голосов
/ 23 декабря 2011

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

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

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

Пример диспетчера аварий

Обновление

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

13 голосов
/ 29 февраля 2016

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

Пример:

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

mGcmNetworkManager.schedule(task);
6 голосов
/ 17 сентября 2015

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

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. Я просто показываю другой подход.

...