现代 Android 中的后台处理

2024-04-14

我已经实现了一些后台任务并使用这个Guide https://developer.android.com/guide/background。 有一次我需要使用协程工作者 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/coroutineworker。我发现这些指南非常好,但每次我需要后台处理的新要求时,我都会开始新的研究来满足我的需要。所以我的问题是,使用现代 Android 解决以下用例的正确方法是什么。另请注意,不同的手机品牌会挑衅地杀死后台任务(有些品牌对后台处理更严厉)。什么时候需要使用持久通知,什么时候不需要,以及什么时候使用报警管理器 https://developer.android.com/reference/android/app/AlarmManager。请为每项写出最佳实施方式以及如果持续通知 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running必需的。

用例:

1.下载大文件(500mb)

A。每天一次,在准确的时间

b 每天一次,当操作系统可以随时

2.下载小文件(5k)

A。每天一次,在准确的时间

b 每天一次,当操作系统可以随时

3.设置准确的时间闹钟

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

A。每 15 分钟一班(最短时间 https://developer.android.com/reference/androidx/work/PeriodicWorkRequest?)

b.一天一次

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

A。每 5 分钟一班

b.每15分钟一班

C。一天一次


根据这个参考 https://developer.android.com/topic/libraries/architecture/workmanagerWorkManager 中,您可以通过它安排三种类型的持久工作,

  • 即时:必须立即开始并很快完成的任务。可能会加急。
  • 长跑:可能运行较长时间(可能超过 10 分钟)的任务。
  • 可延期:稍后启动并可以定期运行的计划任务。

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

推荐自here https://developer.android.com/topic/libraries/architecture/workmanager#other-APIs如果您想在准确的时间设置闹钟,则不应使用 WorkManager,而应使用 AlarmManager,它甚至会在指定时间从打瞌睡模式唤醒设备。


Checkout all possible executions that work manager provides: WorkManager flow (Courtesy of WorkManager guide https://developer.android.com/topic/libraries/architecture/workmanager#types)

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

  1. 下载大文件(500mb)

    a. 每天一次,在准确的时间

    Answer:您可以在此处使用从给定开始时间起每 24 小时安排一次的定期工作,因为它是长时间运行的操作,您可以将其设置为加急/前台来跟踪正在进行的进度。尽管请记住,下载需要有效的互联网连接,并且在指定的时间间隔内,如果不可用,则将安排延迟/稍后执行。

    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. 每天一次,操作系统可以随时

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

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

    a. 每天一次,在准确的时间

    Answer:它可以是安排在 24 小时内立即执行(加急工作)的定期工作,因为下载小文件不会花费很长时间。

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

    b. 每天一次,操作系统可以随时

    Answer:它可以是可延迟执行的定期工作,可以安排在 24 小时。

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

    Answer:要设置闹钟在准确的时间执行,您应该使用 AlarmManager。 WorkManager 无法实现此用例,因为它不会中断 Doze 模式(设备的深度睡眠)。

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

    a. 每 15 分钟一次(最短时间?)

    Answer:这可以是定期工作计划,每 15 分钟作为前台工作,因为它是长时间运行的。

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

    b. 一天一次

    Answer:这可以是每 24 小时的定期工作计划,作为前台工作,因为它是长期运行的。

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

    a. 每 5 分钟一班

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

    b. 每15分钟一班

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

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

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

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现代 Android 中的后台处理 的相关文章

  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • Android平台源码中哪里可以找到版本信息

    Android 平台源文件中的版本信息在哪里找到 我尝试查找 设置 gt gt 中列出的有关手机的一些信息 显示的一些信息包括固件版本 模块编号 基带版本 内核版本 你可以给它办理登机手续platform build core versio
  • Android:如何从输入流创建 9patch 图像?

    我使用下面的代码实例化 9patch 图像并将其设置为按钮的背景 下图显示了不理想的结果 InputStream MyClass class getResourceAsStream images btn default normal 9 p
  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • 如何更改对话框的默认黑色暗淡背景“颜色”(而不是暗淡量)?

    这是随机显示的图像Dialog在网上找到的 我一直在实施一个自定义Dialog 我可以处理对话框上的几乎所有内容 除了对话框本身下方的默认黑色昏暗背景之外 但在其后面的整个屏幕上 基本上我想改变它color和阿尔法值 我一直在 StackO
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • twitter4j => AndroidRuntime(446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken

    我正在尝试使用 twitter4j 我的应用程序来连接并发布到 Twitter 我正在关注本教程 http blog doityourselfandroid com 2011 02 13 guide to integrating twitt
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 使用 Glide 库设置图像加载完成后进度条的可见性

    您好 我想要一个图像进度条 该进度条将在图像加载时显示 但当图像加载完成时 我想将其设置为消失 早些时候我为此使用了毕加索库 但我不知道如何将它与 Glide 库一起使用 我知道有一些资源就绪功能 但我不知道如何使用它 谁能帮我 毕加索图书
  • 在 Android ADT Eclipse 插件中滚动布局编辑器

    有谁知道当布局编辑器的内容溢出一个 屏幕 时如何滚动这些内容 我说的是在设计时使用 ADT 布局编辑器 而不是在物理设备上运行时滚动 效果很好 关闭 Android 布局编辑器中的剪辑 切换剪辑 按钮位于 Android 布局编辑器的右上角
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • firebase中按范围查询

    我有一个食品价格范围滑块 根据滑块的最小值和最大值 我想显示此范围内的食品 滑块代码 multiSlider setOnThumbValueChangeListener new MultiSlider SimpleChangeListene

随机推荐

  • Rxjava - 链接可观察量时如何获取其他类型的流(返回值)而不是当前的流?

    我执行了一个 Retrofit2 observable 调用 在完成后它立即链接到另一个 observable 以将结果存储到数据库中 它看起来很简单 如下所示 protected Observable
  • 设置字符串中某个字符的样式

    我想通过 jQuery 设置字符串中某个字符的样式 但不知道如何实现 我有以下情况 a href Link a 我自己的方法是 a accesskey each selects only those a elements with an a
  • Laravel 中的渴望加载约束过滤器问题

    我无法过滤内容groups表关于username in users表使用急切负载约束 http laravel com docs 4 2 eloquent eager loading public function username ret
  • Jenkins CLI 连接被拒绝

    执行时 java jar jenkins cli jar s https jenkins url help 由于某种原因我的连接被拒绝 Jenkins版本是1580 3 用户拥有Jenkins服务器的权限 cli jar是最新的并且ssh公
  • SQL INNER JOINing 2 子查询

    我试图将这两个子查询 我认为这就是它的名字 内部联接在一起 其中第一个查询的branchName等于第二个查询的branchName 然而 他们似乎并不想联合起来 而且以我有限的 SQL 知识 我似乎找不到解决这个问题的方法 我尝试将括号移
  • Tegra 平板电脑上的 NDK 调试

    今天 我购买了用于本机开发的 Android 平板电脑 采用 Tegra 的 Acer Iconina Tab A500 Honeycomb 3 1 然后我从以下位置下载并安装了 Tegra Android Development Pack
  • Google Cloud Text To Speech API 快速入门示例

    我是这个论坛的新手 我正在尝试让 Google Cloud TTS API 正常工作 但遇到了一些问题 页面是 https cloud google com text to speech docs quickstart protocol h
  • SolrCloud:无法创建集合、锁定问题

    我一直在尝试实现 SolrCloud 一切正常 直到我尝试创建包含 6 个分片的集合 我的设置如下 5 个虚拟服务器 全部运行 Ubuntu 14 04 由一家公司跨不同数据中心托管 为整体运行 ZooKeeper 3 4 6 的 3 台服
  • C# 清除ListView中的所有项目

    我尝试清除列表视图 但清除方法不起作用 myListView Items Clear 这是行不通的 当我在这一行放置断点时 该行将被执行 但我的列表视图不为空 怎么会 我通过将列表视图的数据源设置为数据表来填充列表视图 我现在的解决方案是将
  • 如何在 Symfony4 中将用户添加到 Sentry 以应对所有异常?

    我将 Sentry 添加到我的项目中 但它不会添加某些事件的当前登录用户 我添加了一个事件订阅者 但我不确定我是否真的需要它 对于像 ArgumentCountError 这样的例外情况 一切正常 对于 NotFoundHttpExcept
  • 构建上周、本周和下周的日期数组

    我经常被 Python 中日期的问题绊倒 在我的网络应用程序中 我想显示日历三周的每一天 上周 本周和下周 星期一表示一周的开始 我目前处理这个问题的方法是向后退一步直到星期一 然后再减去 7 天 然后添加 20 天来构建三周范围 但这感觉
  • SwiftUI 中的重复工具栏

    我将工具栏添加到 2 个文本字段 但工具栏显示了两次 这是我的自定义文本字段的代码 public struct SUIDecimalField View public var body some View TextField placeho
  • 在 Google Cloud 中设置网站? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我完全迷失在这之中 我习惯于使用带有 cpanel 的简单 Web 主机来制作网站 只需使用 filezilla 登录并上传我的 ht
  • 如何在 MAC OS X 中获得最大 TCP 接收/发送窗口?

    如何在 MAC OS X 中获得最大 TCP 接收 发送窗口 Linux中有两个ctl proc sys net core rmem max 最大 TCP 接收窗口 NET CORE RMEM MAX proc sys net core w
  • 如何在Android应用程序中读取xlsx文件?

    我知道 stackoverflow 上有很多相同的问题 但似乎我看不到任何可能的解决方案来读取 xlsx 的内容 我尝试过的 我尝试将整个 Apache POI 库放入 Android 应用程序中 并尝试读取 xlsx 文件 然而 问题是
  • Authlogic 中会话模型的自定义验证消息

    在 Authlogic 的会话模型中覆盖登录 密码验证消息的最佳方法是什么 在用户模型中 Authlogic 提供了 merge 方法来覆盖验证选项 但 Session 没有类似的东西 有什么建议么 Authlogic有它自己的国际化等级
  • 覆盖嵌套控件中的隐式样式

    我的应用程序中有一个资源字典 其中它们是为 textblock 定义的通用样式 该字典与 app xaml 合并 现在我有一个要求 我需要在对话框窗口中更改 tabitem 的样式并基于几个触发器设置前景 我已经定义了自己的文本块样式并为
  • Foo f = Foo(); // 没有匹配的函数来调用 'Foo::Foo(Foo)' ... 嗯?

    class Foo public explicit Foo explicit Foo Foo Foo d Foo 错误 没有匹配的函数可用于调用 Foo Foo Foo 我尝试改变Foo Foo to Foo Foo 正如错误所示 据我所知
  • 用于将长 IPv6 地址转换为其压缩形式的 Java 库 [重复]

    这个问题在这里已经有答案了 我想知道是否有一个库可以用来将长 IPv6 地址 例如 2002 9876 57AB 0000 0000 0000 0000 0001 的表示形式转换为压缩的 IPv6 形式 以本例 2002 9876 57AB
  • 现代 Android 中的后台处理

    我已经实现了一些后台任务并使用这个Guide https developer android com guide background 有一次我需要使用协程工作者 https developer android com topic libr