在Android中安排重复任务

2024-02-27

我正在设计一个应用程序,只要该应用程序位于前台,该应用程序就会重复执行将状态发送到专用服务器的任务。

在我在网络上的搜索中,我看到了几种不同的方法,并想知道最好的方法是什么。

安排服务器调用的最佳方式是什么?

我看到的选项是:

  1. Timer http://developer.android.com/reference/java/util/Timer.html.

  2. 调度线程池执行器 http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html.

  3. Service http://developer.android.com/reference/android/app/Service.html.

  4. 广播接收器报警管理器 http://developer.android.com/reference/android/app/AlarmManager.html.

你怎么看?

EDIT:
我需要这个的原因是基于聊天的应用程序将所有用户操作发送到远程服务器。
即用户正在输入消息、用户正在阅读消息、用户在线、用户离线等。

这意味着,每次间隔,我都需要向服务器发送我在做什么,因为我与其他人打开聊天室,他们需要知道我在做什么。

Similar to the whatsapp message feedback mechanism: message looks delivered

EDIT #2:
现在几乎总是通过以下方式安排重复任务JobSchedulerAPI(或FirebaseJobDispatcher https://github.com/firebase/firebase-jobdispatcher-android对于较低的 API),以防止电池耗尽问题,如可以在生命体征部分 https://developer.android.com/topic/performance/vitals/wakeup.htmlAndroid 培训的

EDIT #3:
FirebaseJobDispatcher 已被弃用并由工作经理 https://developer.android.com/topic/libraries/architecture/workmanager,它还结合了 JobScheduler 的功能。


我不确定,但据我所知,我分享我的观点。如果我错了,我总是接受最佳答案。

报警管理器

只要警报接收器处于唤醒状态,警报管理器就会保持 CPU 唤醒锁定。onReceive()方法正在执行。这保证了在您处理完广播之前手机不会休眠。一次onReceive()返回后,警报管理器释放此唤醒锁。这意味着在某些情况下,一旦您的手机进入睡眠状态,手机就会进入睡眠状态。onReceive()方法完成。如果您的报警接收器打来电话Context.startService(),手机可能会在请求的服务启动之前休眠。为了防止这种情况发生,您的BroadcastReceiver and Service将需要实施单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。

注意:警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前未运行也是如此。对于正常的计时操作(滴答声、超时等),使用 Handler 更容易、更高效。

Timer

timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        synchronized public void run() {

            \\ here your todo;
            }

        }, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));

Timer有一些缺点可以通过以下方式解决ScheduledThreadPoolExecutor。所以这不是最好的选择

调度线程池执行器.

您可以使用java.util.Timer or ScheduledThreadPoolExecutor(首选)安排在后台线程上定期发生的操作。

这是使用后者的示例:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate
      (new Runnable() {
         public void run() {
            // call service
         }
      }, 0, 10, TimeUnit.MINUTES);

所以我更喜欢ScheduledExecutorService

但还要考虑一下,如果更新将在您的应用程序运行时发生,您可以使用Timer,如其他答案中所建议的,或较新的ScheduledThreadPoolExecutor。 如果您的应用程序即使未运行也会更新,您应该选择AlarmManager.

警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前未运行也是如此。

请注意,如果您计划在应用程序关闭时进行更新,那么每十分钟更新一次就相当频繁了,因此可能有点太耗电了。

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

在Android中安排重复任务 的相关文章

  • 使用 xamarin 和 c# 更改 android 上的cultureinfo

    我调用自定义方法来动态地将当前文化信息切换为法语 fr 像这样 但在调用该方法后 我的 Android 应用程序仍然使用默认区域性 en 但在调试模式下 区域性似乎没问题 我的文件夹没问题 我两者都有 并且字符串值已配置 文件夹 resou
  • 避免 XferMode 替换画布上的颜色

    我正在尝试替换使用在画布上绘制的内容的颜色避免Xfer模式 http developer android com reference android graphics AvoidXfermode html 从 android 文档来看 它看
  • 现实世界中的 JavaCard 3?

    我目前正在从事我的文凭工作 部分工作包括开发JavaCard常规小程序SIM牌 第一个选项是使用JavaCard2 X API并使用APDU与小程序通信的命令 这可能非常棘手 因为我需要为 android 开发客户端应用程序 它将与这个小程
  • 通过存储访问框架 (SAF) 启用显示/隐藏 SD 卡的额外功能

    我正在使用存储访问框架 SAF Intent intent new Intent Intent ACTION OPEN DOCUMENT intent addCategory Intent CATEGORY OPENABLE intent
  • 自定义 ListView 和 onclick

    这是我的代码 一切 我按照你说的做了 但我仍然无法点击任何内容 我的意思是我可以点击但没有任何反应 package fixus core import java util ArrayList import java util Iterato
  • 在 Android 中使用 PhoneGap 打开 PDF

    我需要打开一个位于 url 中的 PDF 文件 我需要用 PDF 查看器打开它 有可能的 谢谢大家 此致 我建议使用儿童浏览器插件 https build phonegap com blog childbrowser plugin并使用 G
  • Kotlin 协程 - 优雅地处理挂起函数中的错误

    尝试使用从异步方法调用的挂起函数来实现对错误的优雅处理 如何捕获挂起方法引发的错误 suspend fun findById id Long User throw Exception my exception intentionally t
  • 使用书法库的某些活动使用不同的字体

    我在用书法 https github com chrisjenx Calligraphy在我的应用程序中使用自定义字体的库 我使用默认字体为整个应用程序设置了自定义字体CalligraphyConfig in my Application类
  • Android Chrome 忽略 -webkit-text-size-adjust:none 属性。缩小时文本会缩放

    我们的客户请求一个网站 但不想支付移动版本的费用 我们仍在使其在移动设备上运行 当完全缩小时 Android 4 0 上的 Chrome 会缩放一堆文本 我们尝试设置 webkit text size adjust none 属性 但它似乎
  • Android API 列表

    我想获取 CellInfo 数据 但 cellinfo size 总是发生 模拟器中的 NullPointerException 细胞信息链接 http developer android com reference android tel
  • react-native-camera (android): takePictureAsync() 抛出错误

    从react native camera调用takePictureAsync 后 我收到此错误 framesToPop 1 nativeStackAndroid userInfo null message Preview is paused
  • Appcelerator 与 Android SDK

    我一直在看appcelerator 它看起来很不错 毫无疑问 appcelerator的优势之一就是它对多平台的支持 我有兴趣构建一个 Android 应用程序 也许稍后还会构建一个 iPhone 应用程序 所以目前支持多平台并不重要 如果
  • 使用 android-async-http (loopj) 发布 JSON/XML

    我在用android async http http loopj com android async http 并且真的很喜欢它 我在发布数据时遇到了问题 我必须按照以下格式将数据发布到 API
  • Fabric Beta 和 APK 拆分

    我根据 ABI 而不是密度来拆分我的应用程序 如下所示 splits abi enable true reset include x86 armeabi armeabi v7a mips arm64 v8a universalApk tru
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • 跨平台 IAP

    我已在 iOS 和 Android 中集成了应用内购买 自动续订订阅 两者都工作正常 我对使用跨平台验证 IAP 有一定的疑问 例如 当多个用户登录一个应用程序时 某一特定应用程序的订阅如何运作 例如 如果用户 A 有标准套餐并且从应用程序
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • MediaPlayer() 音频口吃(android)

    我正在我的 Android 应用程序中使用 MediaPlayer 函数从远程服务器传输实时音频流 但音频断断续续且断断续续 问题不在于我的互联网 因为当我在计算机上播放时 提要播放得很好 可能是什么问题 注意 直播正在进行中 这是我正在使
  • Android 开发:seekbar 倒计时!

    是否有可能 如果是 如何 如何在用户不执行任何操作的情况下从进度 100 变为 1 就像每0 05秒seekbar setProgress 1 因此 如果用户不执行任何操作 搜索栏就会下降 直到达到 1 请回答如何做到这一点 谢谢 clas

随机推荐

  • Java / Android 编程 - 循环失败

    我正在使用带有计时器的 while 循环 问题是计时器并不是在每个循环中都使用 仅在第一次使用 第一次之后 循环内包含的语句将在没有我设置的延迟的情况下执行 既然计时器包含在 while 循环内 这怎么可能呢 有什么解决办法吗 int co
  • 如何在 HTML 中将文本和图像并排放置?

    我希望文本和图像彼此相邻 但我希望图像位于屏幕的最左侧 而我希望文本位于屏幕的最右侧 这就是我目前所拥有的 img src website art png height 75 width 235 h3 font face Verdana T
  • 如何确定 Django 模型中的类实例是否是另一个模型的子类?

    我有一堂课叫BankAccount作为基类 我也有CheckingAccount and SavingsAccount继承自的类BankAccount BankAccount 不是一个抽象类 但我不从中创建对象 只创建继承类 然后 我执行如
  • 我不知道为什么这个画布是空的

    因此 我一直在研究如何用其他图像填充画布的几个示例 一旦我稍微重新排列代码 它们就会停止工作 我注意到画布上的一些行为与其他类型的 JavaScript 变量相比没有意义 我想知道发生了什么 例如 如果我做这样的事情
  • 在python中读取标头之间的文件

    我有一个大文本文件 其中的值由以 开头的标题分隔 如果条件与标头中的条件匹配 我想读取文件直到下一个标头 并跳过文件的其余部分 为了测试我正在尝试读取以下名为 test234 txt 的文本文件 abcdefgh 1fnrnf mrkfr
  • 我可以在 Play Framework 上的模板/视图中调用会话吗

    我是 Play Framework 2 0 的新手 我使用的是 Scala 并且有一个关于会话的问题 我有 Ruby on Rails 背景 因此我倾向于将在 Play Framework 中学到的所有内容都与 Ruby on Rails
  • 新的 Facebook API 3.0。和 ActionBarSherlock 兼容性

    我正在阅读 facebook Android API 3 0 文档 我不明白会话与后台活动有什么关系 在所有示例中 我都应该扩展 FacebookFragment 好吧 如果我的整个应用程序不扩展 SherlockFragment 那就太好
  • 将模块内的所有函数和类导入到 python 类中

    我正在尝试将子文件夹中的所有对象导入到 python 3 8 中的类中 并且正在努力寻找一种方法来执行此操作 我不想手动导入所有对象 因为要列出的文件太多 class Foo from bar import one two three 当我
  • Once_flag 可以移动吗?

    这是怎么回事 标准没有提到once flag的可移动性 我希望应用与 std mutex 相同的参数 至少对于 gcc 4 8 版 来说 移动似乎被禁用了 如果某个编译器允许移动 那么最终可能会得到不可移植的代码 概要是 30 4 thre
  • ASP.NET MVC 3 Razor 性能

    重要更新 请参阅底部的更新 5 asp net mvc 3 中没有性能问题 这是基准问题 我在 asp net mvc2 3 aspx 和 3 razor 中制作了一个简单的 hello world 项目并对它们进行了基准测试 我看到的是
  • 如何在 Windows 上安装 OpenJPEG 并将其与 Pillow 一起使用?

    我想使用Python Pillow库将16位灰度数组保存在jp2 JPEG 2000 格式 我在尝试在 Windows 计算机上安装所需的 OpenJPEG 库时遇到了困难 这文档 https github com uclouvain op
  • 调用非托管函数,该函数采用指向指针参数的指针

    我正在尝试从我的 Net Core 应用程序调用 C 中的函数 深入了解一下 C 函数来自libmpv 渲染 h https github com mpv player mpv blob master libmpv render h函数的头
  • 如何为给定的 JavaScript 生成调用图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我见过 https stackoverflow com questions 1385335 how to generate funct
  • 显示名称而不是电子邮件的电子邮件标题的格式是什么?

    我正在尝试创建一个 php 脚本 该脚本将使用 mySQL 数据库为我处理邮件列表 并且我已经准备好了大部分内容 不幸的是 我似乎无法让标题正常工作 而且我不确定问题是什么 headers From email protected cdn
  • Julia 中的 ifelse 和三元运算符有什么区别?

    假设我有这样的代码 cond true a cond 1 2 b ifelse cond 1 2 两种操作有什么区别 在你写的例子中 没有任何有效的区别 但是 如果这两个分支比简单的整数字面更复杂 则存在差异 julia gt f prin
  • 适用于 Android 的 OpenGL ES 工具

    在哪里可以找到用于在 OpenGL ES 中设计复杂对象的所有工具 像正方形 立方体 球体等 只需对对象进行建模并将其导出为 OBJ 文件 然后即可将 OBJ 文件加载到场景中 这是我编写的用于加载 OBJ 文件的代码 我将它们从 Maya
  • 无法删除 Kubernetes 中的所有 Pod - 清除/重启 Kubernetes

    我正在尝试删除 删除我的环境中运行的所有 Pod 当我发出 码头工人 我得到以下输出 这是一个示例屏幕截图 可以看到 都是K8 我想删除所有 Pod 删除它们 我尝试了以下所有方法 但它们不断出现 sudo kubectl delete a
  • std::async 是如何实现的?

    我想知道使用它有多合适std async在面向性能的代码中 具体来说 从工作线程捕获异常到主线程是否有任何惩罚 如何从worker返回到main的值 ref 传递的输入参数实际上永远不会被复制吗 我计划将一个繁重的会话对象传递给线程或写入s
  • kafka 和 kafka-client 有什么区别?

    我发现maven仓库里有几个kafka apache的maven仓库中有两个kafka https mvnrepository com artifact org apache kafka kafka https mvnrepository
  • 在Android中安排重复任务

    我正在设计一个应用程序 只要该应用程序位于前台 该应用程序就会重复执行将状态发送到专用服务器的任务 在我在网络上的搜索中 我看到了几种不同的方法 并想知道最好的方法是什么 安排服务器调用的最佳方式是什么 我看到的选项是 Timer http