0

我正在开发一个具有每周功能的 Android 应用程序,也就是说,用户必须将一周中的每一天标记为完成。这个值是我数据库上的一个布尔值,初始化为 false,并在用户单击复选框时设置为 true。一切正常。

但我的问题是,每次新的一周开始时,我都需要在一周的所有 7 天里将这个布尔值“重置”为 false。我不需要过去几周的记录。重要的是实际的一周(周日到周六)。

这是一个非常简单的任务,我只需要这样做:

for(WeekDay day: dao.getWeekDays()){
            day.setDone(false);
            dao.updateWeekDay(day); //update the value in database
        }

所以,我做了一些研究(我是安卓新手),发现安卓有不同的调度服务,比如 JobScheduler 或 AlarmManager。我的应用专为 Android 10+(API 29+)而设计。你认为我的问题的最佳解决方案是什么?这是一项非常简单的任务(它不会占用太多电池、互联网……),我需要在每周的特定日期(星期日)执行此操作。此外,即使周日手机关机,这项任务也需要尽快完成。它不需要是后台服务,但我需要保证当用户打开应用程序并且它是新的一周时,该方法需要在之前调用,但前提是它之前的实际一周没有被调用.

有人有想法吗?

4

1 回答 1

0

好的,根据我阅读的其他类似答案,我想我为我的问题找到了一个简单的解决方案。我只需要在每次应用程序启动时运行这些功能。我不需要使用任何后台服务,比如 WorkManager。我只需要在 SharedPreferences 中存储系统重置值的最后日期。然后,每次我打开应用程序时,它都会检查今天是否与上次重置日不同的一周。如果是真的,那么我在问题中运行“for 循环”,并在 SharedPreferences 中将最后一个重置日更新为今天。如果是假的,我什么都不做。

inSameCalendarWeek 方法检查这一天是否与今天的同一年在同一周(Locale.US 保证一周从星期日开始。但我可以将其更改为 Locale.getDefault() 以更灵活)。此外,例如,如果 12 月 31 日与 1 月 1 日在同一周,即使它们在不同年份,该方法也会返回 true。

private void checkAndResetDoneDays() {
        long lastResetDay = settings.getLong(LAST_DAY_RESET, 0);
        LocalDate date = Instant.ofEpochMilli(lastResetDay).atZone(ZoneId.systemDefault()).toLocalDate();
        if (!inSameCalendarWeek(date)) {
            resetDoneDays();
            settings.edit()
                    .putLong(LAST_DAY_RESET, LocalDate.now(ZoneId.systemDefault()).atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
                    .commit();
        }
    }

public boolean inSameCalendarWeek(LocalDate firstDate) {
        LocalDate secondDate = LocalDate.now(ZoneId.systemDefault());
        // get a reference to the system of calendar weeks in US Locale (to guarantee that week starts on Sunday)
        WeekFields weekFields = WeekFields.of(Locale.US);
        // find out the calendar week for each of the dates
        int firstDatesCalendarWeek = firstDate.get(weekFields.weekOfWeekBasedYear());
        int secondDatesCalendarWeek = secondDate.get(weekFields.weekOfWeekBasedYear());
        /*
         * find out the week based year, too,
         * two dates might be both in a calendar week number 1 for example,
         * but in different years
         */
        int firstWeekBasedYear = firstDate.get(weekFields.weekBasedYear());
        int secondWeekBasedYear = secondDate.get(weekFields.weekBasedYear());
        // return if they are equal or not
        return firstDatesCalendarWeek == secondDatesCalendarWeek
                && firstWeekBasedYear == secondWeekBasedYear;
    }
于 2020-10-10T19:31:29.107 回答