Вот реализация того, что я упомянул в своем комментарии:
public class MainActivity extends AppCompatActivity {
private static final String PREF_PAUSE_TIME_KEY = "exit_time";
private static final Long MILLIS_IN_DAY = 86400000L;
private static final int TRIGGER_HOUR = 12;
private static final int TRIGGER_MIN = 0;
private static final int TRIGGER_SEC = 0;
private final Handler handler = new Handler();
private SharedPreferences prefs;
private final Calendar calendar = Calendar.getInstance();
private final Runnable addItemRunnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(addItemRunnable, MILLIS_IN_DAY);
addItem();
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
prefs = PreferenceManager.getDefaultSharedPreferences(this);
}
@Override
protected void onResume() {
super.onResume();
// Add missing events since onPause.
long resumeTime = System.currentTimeMillis();
long pauseTime = prefs.getLong(PREF_PAUSE_TIME_KEY, resumeTime);
// Set calendar to trigger time on the day the app was paused.
calendar.setTimeInMillis(pauseTime);
calendar.set(Calendar.HOUR_OF_DAY, TRIGGER_HOUR);
calendar.set(Calendar.MINUTE, TRIGGER_MIN);
calendar.set(Calendar.SECOND, TRIGGER_SEC);
long time;
while (true) {
// If calendar time is during the time that app was on pause, add item.
time = calendar.getTimeInMillis();
if (time > resumeTime) {
// Past current time, all items were added.
break;
} else if (time >= pauseTime) {
// This time happened when app was on pause, add item.
addItem();
}
// Set calendar time to same hour on next day.
calendar.add(Calendar.DATE, 1);
}
// Set handler to add item on trigger time.
handler.postDelayed(addItemRunnable, time - resumeTime);
}
@Override
protected void onPause() {
super.onPause();
// Save pause time so items can be added on resume.
prefs.edit().putLong(PREF_PAUSE_TIME_KEY, System.currentTimeMillis()).apply();
// Cancel handler callback to add item.
handler.removeCallbacks(addItemRunnable);
}
private void addItem() {
// Add item to database and RecyclerView.
}
}
- Когда вызывается
onPause
, текущее время сохраняется в настройках. - Когда
onResume
вызвано, программа добавляет каждый элемент, который должен был быть добавлен, пока приложение не было открыто. - Когда приложение открыто, программа использует
Handler
, чтобы опубликовать задачу с указанным c time.
Вы можете переместить код куда угодно, скорее всего, в вашем хранилище или в модели представления, если она у вас есть. Для таймера вы можете использовать Rx Java для таймера в приложении или что-то еще на самом деле.
Если пользователь изменит время на несколько дней раньше, добавленные элементы не будут удалены. Если пользователь затем вернет его в нормальное состояние, элементы на несколько дней будут продублированы. Вы можете предотвратить это, сохранив время в onPause
, только если оно больше последнего сохраненного времени.