3

这个问题之后,我查看了 Android Job Scheduling,如果我想每个月做一次事情,Work Manager 似乎是最新的工具。我构建了一个 Worker 类并在我的活动中使用此代码段激活它:

PeriodicWorkRequest myWorkRequest =
                new PeriodicWorkRequest.Builder(MonthlyWorker.class, 20, TimeUnit.MINUTES)
                        .build();
WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);

虽然我成功测试了 20 分钟的时间,但有一个问题:几个月没有可用的时间单位,只有几天。由于显而易见的原因,每 30 天做一次工作是行不通的,因为我需要在每个月的第一天执行任务。所以我该怎么做?我必须使用不同的 API 吗?谢谢你。

我可以做类似的事情if (dayOfMonth==1) do Function,但我认为这会破坏调度程序的目的。

4

1 回答 1

2

您可以自己按分钟完成:

只需将天转换为分钟:

这里:30 天 = 43200 分钟 = 1 个月

PeriodicWorkRequest myWorkRequest =
            new PeriodicWorkRequest.Builder(MonthlyWorker.class, 43200, TimeUnit.MINUTES)
                    .build();
WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);

更新:

根据我的要求,我想在上午 8 点到下午 6 点之间每30 分钟执行一次任务

在我为您制作的那个工人的帮助下,您需要 在每个月的 1 日凌晨 12 点到凌晨 2 点之间

public class TestWorker extends Worker {

    private static final String DEFAULT_START_TIME = "00:01"; //12:01 am
    private static final String DEFAULT_END_TIME = "03:00"; // 03:00 am

    private static final String TAG = "TestWorker";

    public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        /**
         * Its for time
         */
        DateFormat dateFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());

        /**
         * Get Current Calendar Instance
         */
        Calendar c = Calendar.getInstance();

        // Get current day of month
        int day = c.get(Calendar.DAY_OF_MONTH);

        /**
         * Get current time and compare with our start and end date.
         */
        Date date = c.getTime();
        String formattedDate = dateFormat.format(date);

        try {
            Date currentDate = dateFormat.parse(formattedDate);
            Date startDate = dateFormat.parse(DEFAULT_START_TIME);
            Date endDate = dateFormat.parse(DEFAULT_END_TIME);

            /**
             * This condition will check that day is 1, and time interval in between give time.
             */         
            if (day == 1 && currentDate.after(startDate) && currentDate.before(endDate)) {
                // Do your work here
            }
        } catch (ParseException ignored) {

        }

        return Result.success();
    }
}

您可以以 X 小时间隔开始此测试工作,因此它将每 X 小时检查一次(例如,在您的情况下,您可以给 2 小时,因此它将每两个小时检查一次)

我不知道它是否会影响性能,但我认为没有其他解决方案。

您可以按以下方式启动工人:

PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 2, TimeUnit.HOURS)
                .addTag("MYWORK")
                .build();

WorkManager.getInstance().enqueueUniquePeriodicWork("MYWORK", ExistingPeriodicWorkPolicy.REPLACE, periodicWork);

希望它会有所帮助。

于 2019-05-27T13:08:29.197 回答