现代后台处理 Android

Background processing in modern Android

我用 WorkManager and with usage this Guide 实现了一些后台任务。 有一次我需要使用 CoroutineWorker. I find these guide pretty good but every time I need new requirement for background processing I start new research for what I need. So my question is what is the correct way to address the following use cases with modern Android. Also please consider that different phone brands kill background task defiantly (Some brands more harsh on background processing). And when do I need to use persistent notification and when it is not required, and when to use AlarmManger. Please write for each the best way to implement and if Persistent notification required.

用例:

1。正在下载大文件 (500mb)

一个。每天准时一次

b一天一次OS可以,随时

2。正在下载小文件 (5k)

一个。每天准时一次

b一天一次OS可以,随时

3。准时设置闹钟

4.与服务器同步数据库(运行时约 5 分钟的大数据)

一个。每 15 分钟 (Minimal time?)

b。一天一次

5.与服务器同步数据库(运行时小于 1 秒的小数据)

一个。每 5 分钟

b。每 15 分钟

c。一天一次

请查看我在这里给出的答案以获取更多信息:

Android recommended and reliable API for periodic background work?

1。正在下载一个大文件 (500mb)

一个。每天一次在准确的时间 - 你可以在这里设置一个准确的闹钟,但是你会遇到从后台启动服务的 Android 12 限制(更多信息在另一条评论中)。所以这取决于用例。我就是不会去那里。

b 每天一次 OS 可以,在任何时间 - 与 WorkManager 一起去,但理论上它取决于 Power Buckets 所以如果你去在较低的地方,您可能会多过一天。此外,开始和结束是不同的。您可能会开始达到每天 10 分钟的限制。 (更多内容在另一条评论中)

2。下载小文件(5k) 一种。每天一次在准确的时间 - 作为一个大文件。

b当OS可以每天一次,随时-作为一个大文件。

3。在准确的时间设置闹钟 - 这取决于你做什么。我不明白这个

4。将 DB 与服务器同步(大约 5 分钟运行时间的大数据) - 你需要 WorkManager 来处理这样的事情。

对于以上所有 - 15 分钟来自打瞌睡模式。但即使它有“两种口味”。这15分钟只是理论上的。实际上可能更多。 WorkManager 具有“定期工作”的概念。实际上没有这样的事情。 WorkManager 使用约束的概念。因此,您有需要网络的限制,需要设备充电的限制,并且有“时间限制”。所以你看 - 24 小时的“定期工作”只是一个有额外限制的工作:“不要在少于 24 小时内开始”。但这并不意味着“每 24 小时”。理论上 24 小时可能已经过去,时间限制得到满足,然后由于其他原因,您在 1 周内成功执行,工作再次重新安排另一个 24 小时时间限制。

对于诸如“每 5 分钟、15 分钟、15 分钟”之类的内容 - 只需在服务通知中使用以下文本提出服务:“我们的应用程序讨厌你的电池”,永远不要停止它,并做任何你需要的事情:)但是完全反对新的 Android 概念。

即使您使用推送通知(如果它们不是高优先级),您也将有效地回退到 WorkManager 以稍后完成工作。

就像我说的:“一天一次”意味着“很可能一天一次”

一个。每 15 分钟(最短时间?)

b.一天一次

5.与服务器同步数据库(运行时小于 1 秒的小数据)

一个。每 5 分钟

b.每 15 分钟

c.一天一次

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

  • Immediate: Tasks that must begin immediately and complete soon. May be expedited.
  • Long Running: Tasks which might run for longer, potentially longer than 10 minutes.
  • Deferrable: Scheduled tasks that start at a later time and can run periodically.

这意味着您的大部分用例都可以通过使用 WorkManager 来实现,除了您需要 运行“每 5 分钟”和“在准确时间设置警报”的两种情况。

here 的建议是,如果您想在准确的时间设置闹钟,则不应使用 WorkManager,而应使用 AlarmManager,它甚至会在指定时间从休眠模式唤醒设备。


检查工作管理器提供的所有可能的执行: (由 WorkManager guide 提供)

因此,根据您的 use-cases:

,您可以使用以下所有可能的方法
  1. 正在下载大文件 (500mb)

    一个。 每天准时一次

    答案: 你可以在这里使用 PeriodicWork 从给定的开始时间起每 24 小时安排一次,因为它是一个很长的 运行ning 操作你可以让它 expedited/foreground 跟踪正在进行的进展。请记住,下载需要有效的互联网连接,并且如果它不可用,则在指定的时间间隔内将安排 delayed/later 执行。

    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。 每天一次OS可以,随时

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

    PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
         // Additional configuration
         .build()
    
    //Calling setForeground() from doWork() will show ongoing notification
    
  2. 正在下载小文件(5k)

    一个。 每天准时一次

    回答:可以是PeriodicWork,立即执行(加急工作)安排24小时,因为下载小文件不会花很长时间。

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

    b。 每天一次OS可以,随时

    答:可以是PeriodicWork,可延迟执行,可按24小时调度。

    PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
       // Additional configuration
       .build()
    
  3. 在准确时间设置闹钟

    答案:要设置闹钟在准确的时间执行,您应该使用AlarmManager。这个用例对于 WorkManager 是不可能的,因为它不会中断打盹模式(设备的深度睡眠)。

  4. 与服务器同步数据库(大数据约5分钟运行时间)

    一个。 每 15 分钟(最短时间?)

    回答: 这可以是每 15 分钟安排一次的 PeriodicWork 作为前台工作,因为它很长 运行ning.

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

    b。 一天一次

    回答: 这可以是每 24 小时安排的 PeriodicWork 作为前台工作,因为它很长 运行ning.

     PeriodicWorkRequestBuilder<SyncToServerWorker>(1, TimeUnit.DAYS)
         // Additional configuration
         .build()
    
     //Calling setForeground() from doWork() will show ongoing notification
    
  5. 与服务器同步数据库(小数据不到1秒运行时间)

    一个。 每 5 分钟

    回答: 这 use-case 是无法实现的,因为 WorkManager 的周期性工作的最小 time-frame 是 15 分钟。因此,建议通过前台service/alarm管理器组合手动管理此周期性工作。

    b。 每 15 分钟

    答案: 这可以通过每 15 分钟安排一次的 PeriodicWork 来实现,它可以根据 urgent/relaxed 的要求进行加速或延迟。

     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。 一天一次

    答案:这是每 24 小时安排一次的 PeriodicWork 示例,它可以根据urgent/relaxed 的要求进行加速或延迟。

     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()
    

创建long 运行ning worker参考:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running

希望对您有所帮助!