我用WorkManagerGuide实现了一些后台任务.

用例:

1. Downloading large file (500mb)

a、 每天一次,准确时间

b每天一次,当操作系统可以在任何时候

2. Downloading small file (5k)

a、 每天一次,准确时间

b每天一次,当操作系统可以在任何时候

3. Setting alarm at exact time

4. Sync DB with server (large data about 5min runtime)

a、 每15分钟(Minimal time?)

b、 每天一次

5. Sync DB with server (small data less than 1sec runtime)

a、 每5分钟

b、 每15分钟

c、 每天一次

推荐答案

根据WorkManager的this reference,您可以通过它安排三种类型的持续性工作,

  • Immediate:必须立即开始并尽快完成的任务.可以加急.
  • Long Running:可能运行时间更长,可能超过10分钟的任务.
  • Deferrable:稍后开始并可以定期运行的计划任务.

这意味着您的大多数用例都可以通过使用WorkManager来实现,但有两种情况需要"每5分钟"运行一次;"在准确时间设置alert ".

建议从here开始,如果您想在准确的时间设置alert ,则不应使用WorkManager,而应使用AlarmManager,它将在指定的时间甚至从打盹模式唤醒设备.


Checkout all possible executions that work manager provides: WorkManager flow (Courtesy of WorkManager guide)

因此,根据您的用例,您可以使用以下所有可能的方法:

  1. Downloading large file (500mb)

    a、 Once a day on exact time

    Answer:您可以在此处使用PeriodicWork,从给定的开始时间开始,每24小时计划一次,因为这是一项长期运行的操作,您可以使其快速/前台跟踪正在进行的进度.虽然请记住,下载需要活动的internet连接,如果不可用,则会按指定的时间间隔进行,然后将其计划为延迟/稍后执行.

    PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
        .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
        // Additional configuration
        .build()
    
    //Calling setForeground() from doWork() will show ongoing notification
    

    b、 Once a day when the OS can, in any time

    Answer:这是您可以使用PeriodicWork不确定地执行某些任务的最佳示例.在这里,您可以将其延迟,因为它不需要在特定时间执行.

    PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
         // Additional configuration
         .build()
    
    //Calling setForeground() from doWork() will show ongoing notification
    
  2. Downloading small file (5k)

    a、 Once a day on exact time

    Answer:它可以是周期性的工作,并立即执行(加急工作),计划24小时,因为下载小文件不会花费很长时间.

    PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
        .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
        // Additional configuration
        .build()
    

    b、 Once a day when the OS can, in any time

    Answer:它可以是具有延迟执行的周期性工作,可以安排在24小时内.

    PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
       // Additional configuration
       .build()
    
  3. Setting alarm at exact time

    Answer:要设置在准确时间执行的报警,应使用AlarmManager.WorkManager无法使用此用例,因为它不会中断打盹模式(设备的深度睡眠).

  4. Sync DB with server (large data about 5min runtime)

    a、 Every 15 min (Minimal time?)

    Answer:这可以是每隔15分钟安排的周期性工作,因为它是长期运行的前台工作.

     PeriodicWorkRequestBuilder<SyncToServerWorker>(15, TimeUnit.MINUTES)
         // Additional configuration
         .build()
    
     //Calling setForeground() from doWork() will show ongoing notification
    

    b、 Once a Day

    Answer:这可以是每隔24小时安排的周期性工作,因为它是长期运行的前台工作.

     PeriodicWorkRequestBuilder<SyncToServerWorker>(1, TimeUnit.DAYS)
         // Additional configuration
         .build()
    
     //Calling setForeground() from doWork() will show ongoing notification
    
  5. Sync DB with server (small data less than 1sec runtime)

    a、 Every 5 min

    Answer:由于WorkManager的定期工作的最小时间框架为15分钟,因此无法实现此用例.因此,建议通过前台服务/报警管理器组合手动管理此定期工作.

    b、 Every 15 min

    Answer:这可以通过每15分钟安排一次的周期性工作来实现,根据需要的紧急/放松程度,可以加快或推迟.

     PeriodicWorkRequestBuilder<SyncDataWorker>(15, TimeUnit.MINUTES)
         .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally
         // Additional configuration
         .build()
    

    c、 Once a Day

    Answer:这是每24小时安排一次周期性工作的例子,根据需要的紧急/放松程度,可以加快或推迟.

     PeriodicWorkRequestBuilder<SyncDataWorker>(1, TimeUnit.DAYS)
         .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally
         // Additional configuration
         .build()
    

创建长期工作人员的参考:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running

希望这有帮助!

Android相关问答推荐

Jetpack DataStore原生lib已添加到Bundle 包:libdatastore_share_counter.so-那是什么?

在Android Studio Iguana上运行示例代码时,Gradle Build错误

长流与长流的比较<>

Kotlin Gzip字符串未按预期工作

fillMaxHeight中的分数在列内不起作用(android jetpack compose)

Jetpack Compose:如何将浮动操作按钮上方的子按钮居中对齐?

StateFlow集合AsState没有更新他的值Jetpack Compose导航

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

尽管我们不再使用GCM SDK,但应用程序已被标记为使用GCM SDK

我怎样才能画一条线在喷气背包组成和有一个自定义的角落?

在Jetpack Compose中实现焦点突出的最佳方式?

jetpackcompose-如何对解析后的复杂对象进行状态提升?

Material 3的MaterialSwitch默认大小太大了?如何使它变小?

Android WebView 不会在滚动端加载新内容

在模块 jetified-kotlin-stdlib-1.8.10 中发现重复的类 kotlin.random.jdk8,带有启动基准

AirDroid Business 如何能够从屏幕截图中排除覆盖?

在 Compose 中停止键盘将顶部应用栏推离屏幕

禁用通知权限后启动前台服务导致崩溃(Android 13)

自定义布局忽略可组合的大小

升级到 android studio 花栗鼠后,应用程序未安装在模拟器中