我正在设计一个应用程序,只要该应用程序位于前台,该应用程序就会重复执行将状态发送到专用服务器的任务。
在网络搜索中,我看到了几种不同的方法,并想知道实现此目的的最佳方法是什么。
安排服务器调用的最佳方式是什么?
我看到的选项是:
Timer .
Service .
广播接收器 AlarmManager .
你有什么看法?
编辑:
我需要这个的原因是基于聊天的应用程序将所有用户操作发送到远程服务器。
即用户正在输入消息、用户正在阅读消息、用户在线、用户离线等。
这意味着每隔一个时间间隔,我就需要向服务器发送我在做什么,因为我与其他人打开聊天室,他们需要知道我在做什么。
类似于whatsapp消息反馈机制:
编辑#2:
现在应该几乎总是通过 JobScheduler
API(或较低 API 的 FirebaseJobDispatcher
)来安排重复任务,以防止电池耗尽问题,如 vitals section 中所述。 Android 培训的内容
编辑#3:
FirebaseJobDispatcher 已弃用并替换为 Workmanager ,它还结合了 JobScheduler 的功能。
最佳答案
我不确定,但据我所知,我分享我的观点。如果我错了,我总是接受最佳答案。
警报管理器
只要警报接收器的 onReceive()
方法正在执行,警报管理器就会持有 CPU 唤醒锁。这保证了在您处理完广播之前手机不会休眠。一旦onReceive()
返回,警报管理器就会释放此唤醒锁。这意味着在某些情况下,一旦您的 onReceive()
方法完成,手机就会进入休眠状态。如果您的警报接收器调用了Context.startService()
,则手机可能会在启动请求的服务之前进入休眠状态。为了防止这种情况,您的 BroadcastReceiver
和 Service
将需要实现单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。
注意:警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前未运行也是如此。对于正常的计时操作(滴答声、超时等),使用 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.Timer
或ScheduledThreadPoolExecutor
(首选)来安排在后台线程上定期发生的操作。
这是使用后者的示例:
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/