【问题标题】:Schedule a Particular task on every Friday via WorkManager API通过 WorkManager API 在每周五安排一项特定任务
【发布时间】:2019-11-28 11:55:24
【问题描述】:

我在每个星期五使用 workmanager 发送短信以进行提醒。甚至,应用程序也处于关闭状态。 示例:

PeriodicWorkRequest periodicWork = new 
    PeriodicWorkRequest.Builder(MyWorker.class, 7, TimeUnit.DAYS).build();
WorkManager.getInstance().enqueue(periodicWork);

任何人都可以帮助解决这个问题。谢谢。

注意:我有这个一次性请求。它工作正常。甚至,应用程序也关闭了。

WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(new OneTimeWorkRequest.Builder(MyWorker.class).build());

如果假设 workmanager 是不可能的,请在 android 中推荐任何其他 api。

也已推荐此链接:它不起作用。 Schedule a work on a specific time with WorkManager

【问题讨论】:

  • 能否请您定义这里的问题实际上是什么?

标签: android alarmmanager android-jetpack android-workmanager android-jobscheduler


【解决方案1】:

不是最好的解决方案,但可以。 使用 PeriodicWorkRequest 并每天安排任务。然后使用 jodatime 库并检查当天是否为星期五。如果是星期五执行任务。如果没有取消任务。根据第一次执行,您可以通过在请求中添加 6 来操纵 PeriodicWorkRequest 以安排每个星期五。

【讨论】:

  • 感谢您的回复。我试过这个定期。但是,它只运行一次。假设,在移动设置中关闭网络数据时间,然后,在日历中手动更改日期时,通知不会触发。你能说,哪个版本用于workmanager依赖?我现在尝试使用 'androidx.work:work-runtime:2.2.0'。
【解决方案2】:

WorkManager 是这个用例的错误选择。

为什么?

WorkManager 适用于可延迟(即不需要立即运行)并且即使应用退出或设备重新启动也需要可靠运行的任务。

如果您希望您的任务在某个时间点准确运行,您应该使用 AlarmManager。

【讨论】:

    【解决方案3】:

    可以使用AlarmManager(未尝试使用workmanager,但使用AlarmManager 测试和工作的以下方式)。

    每周周五执行一次,你需要注册广播接收器来接收意图,这样你就可以在接收时发送短信了..

        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("RECIVER"), 0 );
    
        AlarmManager alarm = (AlarmManager) Context.getSystemService(Context.ALARM_SERVICE);
        Calendar timeOff = Calendar.getInstance();
        int days = Calendar.FRIDAY + (7 - timeOff.get(Calendar.DAY_OF_WEEK)); 
        timeOff.add(Calendar.DATE, days);
        timeOff.set(Calendar.HOUR, 12);
        timeOff.set(Calendar.MINUTE, 0);
        timeOff.set(Calendar.SECOND, 0);
    
        alarm.set(AlarmManager.RTC_WAKEUP, timeOff.getTimeInMillis(), pintent);
    

    【讨论】:

      【解决方案4】:

      以下步骤可能会有所帮助:

      1. 使用警报管理器 API 来触发待处理的意图。
      2. 收到广播后执行步骤 1。
      3. 使用另一个广播接收器重新启动设备 (BOOT_COMPLETED) 后执行第 1 步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 2018-12-14
        • 2015-05-09
        相关资源
        最近更新 更多