Как запустить таймер в фоновом режиме для выполнения операции после определенных периодов? - PullRequest
0 голосов
/ 22 января 2020

У меня есть кнопка с лимитом 5 в день и 30 в месяц. Каждый раз, когда он нажимается, он уменьшается на 1 от ежедневного остатка и ежемесячного остатка. После того, как на него щелкнули 5 раз, оставшиеся клики в день равны 0, а оставшийся месяц - 25. Как я могу сбросить этот счетчик каждые 24 часа обратно на 5 в фоновом режиме, даже если приложение не запущено или устройство не запущено включенный. И как мне сделать то же самое в течение 30 дней (месяц). В настоящее время я использую SharedPreferences для обновления значений, когда я хочу. Но я хочу, чтобы это происходило периодически, не каждый раз, когда приложение запускается

sharedPreferences.edit().putInt("dailyRemaining", dailyRemaining).apply(); //5
sharedPreferences.edit().putInt("monthlyRemaining", monthlyRemaining).apply(); //30

Ответы [ 3 ]

3 голосов
/ 22 января 2020

Для выполнения любой задачи по истечении определенных периодов необходимо обратиться к android менеджеру по работе или android работе.

Менеджер работы [https://developer.android.com/topic/libraries/architecture/workmanager]

Evernote android работа [https://github.com/evernote/android-job]

Надеюсь, это поможет вам.

0 голосов
/ 22 января 2020

Это относительно простая задача, которую можно выполнить в фоновом режиме, когда она может быть просто выполнена при запуске приложения. Реализация и поддержание фоновых задач сами по себе - большая работа, поэтому, если вам не нужно ничего делать в фоновом режиме при изменении даты (например, отправка уведомления или отправка этой информации бэкэнду и т. Д. c). ), Я бы посоветовал сделать это простым и на уровне пользовательского интерфейса. Вы можете сделать что-то вроде этого в вашем основном Activity или переопределить ваш Application класс и сделать это там):

// Build today date and current month strings which will be used as keys
String todayDate = getDateFromFormat("dd-MM-yyyy");
String currentMonth = getDateFromFormat("MM-yyyy");

// Try to get the remaining limit from sharedpreferences, and give them default
// values if they don't exist yet
int remainingForToday = sharedPreferences.getInt(todayDate, 5);
int remainingThisMonth = sharedPreferences.getInt(currentMonth, 30);

// When the user clicks on the button, decrement and save the remaining 
sharedPreferences.edit().putInt(todayDate, remainingForToday - 1).apply();
sharedPreferences.edit().putInt(currentMonth, remainingThisMonth - 1).apply();

// Utility function to get the date time strings using native Java classes
private String getDateFromFormat(String format) {
    Calendar today = Calendar.getInstance();
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.format(today.getTime());
}

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

0 голосов
/ 22 января 2020

Для сброса значений каждые 24 часа вы можете использовать AlarmManager. С его помощью вы можете запланировать выполнение услуги, которая будет сбрасывать значения в SharedPreferences. Но у AlarmManager есть проблемы, когда телефон перезагружается, его нужно перенести. Не волнуйтесь, вот руководство , которое объясняет, как обрабатывать все эти вещи.

Также вы можете использовать новый WorkManager API. + hand код лаборатории как ее использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...