android - 在Android中安排重复任务

标签 android scheduled-tasks

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

在网络搜索中,我看到了几种不同的方法,并想知道实现此目的的最佳方法是什么。

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

我看到的选项是:

  1. Timer .

  2. ScheduledThreadPoolExecutor .

  3. Service .

  4. 广播接收器 AlarmManager .

你有什么看法?

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

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

类似于whatsapp消息反馈机制: message looks delivered

编辑#2:
现在应该几乎总是通过 JobScheduler API(或较低 API 的 FirebaseJobDispatcher)来安排重复任务,以防止电池耗尽问题,如 vitals section 中所述。 Android 培训的内容

编辑#3:
FirebaseJobDispatcher 已弃用并替换为 Workmanager ,它还结合了 JobScheduler 的功能。

最佳答案

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

警报管理器

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

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

计时器

timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        synchronized public void run() {

            \\ here your todo;
            }

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

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

ScheduledThreadPoolExecutor

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

这是使用后者的示例:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();

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

所以我更喜欢ScheduledExecutorService

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

The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running.

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

关于android - 在Android中安排重复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803766/

相关文章:

java - android listview null 试图 setAdapter()

python - Windows 任务计划程序运行 Python 脚本 : how to prevent taskeng. exe 弹出窗口?

android - Alarmmanager 第一次触发但不会重复

Android:使用加速度计检测轻弹

android - 如何在画廊中的图像之间创建空间?

java - 终止应用程序和 ScheduledExecutorService;线

power-shell 脚本的 Windows 调度不可靠

spring - WebSocketConfigurer 和 @Scheduled() 在应用程序中不能很好地工作

windows-7 - 如何使用命令提示符运行现有的 Windows 7 任务

android - 如何减小 FastScroll 拇指大小