创建一个长时间运行的服务

4

我需要创建一个服务,与安卓应用一起运行,无论用户在应用的哪个屏幕上。 该应用是一个聊天应用程序,因此当设备离线时,服务应将所有正在离线发送的消息排队,并在设备连接时同步所有消息。

我已经编写了作业调度程序的代码,在设备在线时自动同步数据,但在应用程序处于活动状态时,我希望手动处理此问题。


只需使用Alarm Manager并在特定间隔触发。长时间运行的服务可能会被系统操作系统杀死。 - Rameshbabu
3个回答

2

创建长时间运行的服务

操作系统仍然可以在低内存和可能的其他情况下终止服务。有两种方法可以克服这个问题:

  1. 如果您正在实现该服务,请覆盖onStartCommand()并返回START_STICKY作为结果。这将告诉系统,即使由于低内存而想要杀死您的服务,它也应该在内存恢复正常后立即重新创建它。

  2. AlarmManager。一个系统服务,它会定期执行操作。这将确保如果您的服务被终止,甚至整个进程都会死亡(例如强制关闭),它将由AlarmManager 100%重启。

谢谢。


在 Android O(Android 8)中,如果您的目标是 API 26,则它们已更改后台进程(服务)的行为。因此,如果您仍需要长时间运行的服务,则建议将其启动为前台服务。 - Elior
重启后,它在哪个线程中运行?主线程已经“死”了吧? - Pavel Poley

1

为此,您需要使用带有sticky的intent服务而不是服务,该服务将在队列中执行并完成您的工作。由于它是一个意图服务,因此当系统杀死服务进程后,它将自动启动。


Intent服务将处理数据一次并完成其执行,我需要该服务在应用程序运行时一直运行。对于Intent服务,每当需要处理某些内容时,我都需要启动该服务。 - Jude Fernandes
编写一个定时器,如果需要,它将以规律的间隔启动意图服务。 - Akash
我编辑了问题,请看一下,定时器不是一个好主意,因为聊天应用是实时的。 - Jude Fernandes
我相信在这种情况下,Android现在建议使用JobIntentService类型。它通过实现一个IntentService向后兼容较低的API级别,并通过JobScheduler支持API 25及以上。 - MedievalCoder

1
你可以通过简单的步骤来完成这个操作:
  1. 创建一个简单的服务,并在应用程序第一次启动时从闪屏屏幕开始。
  2. 在服务中获取一个数据后,您可以调用另一个请求。
  3. 之后,您可以全局创建一个广播动作,它将始终调用每个网络更改。
  4. 在后台,您可以再次同步数据并将其保存到共享首选项或根据您的要求进行保存。
  5. 对于间隔,您还可以使用AlarManager。
此外,您还可以使用JobSheduler简单地创建服务,在其中分配作业和时间。
参考链接:

https://developer.android.com/reference/android/app/job/JobScheduler.html

希望这个逻辑能够帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接