【问题标题】:Create a Long Running service创建一个长期运行的服务
【发布时间】:2017-06-20 11:19:22
【问题描述】:

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

我已经为作业调度程序编写了代码,以便在设备在线时自动同步数据,但在应用程序处于活动状态时我想手动处理。

【问题讨论】:

  • 只需使用警报管理器并在一定时间间隔触发。长时间运行的服务可能会被系统操作系统杀死。

标签: android service broadcastreceiver android-broadcast intentservice


【解决方案1】:

创建长期运行的服务。

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

  1. 如果您正在实施该服务,请覆盖 onStartCommand() 并返回 START_STICKY 作为结果。它会告诉系统,即使由于内存不足而想终止您的服务,它也应该在内存恢复正常后立即重新创建它。

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

谢谢。

【讨论】:

  • 在 Android O (Android 8) 上,如果您的目标是 API 26,它们会更改后台进程(服务)的行为。因此,如果您仍需要长期服务,他们建议您将其作为前台服务启动。
  • 重启后,在哪个线程运行?主线程“死”了不是吗?
【解决方案2】:

您可以通过以下简单步骤做到这一点:

  1. 创建简单服务并在首次启动应用程序后从初始屏幕开始。
  2. 在服务中获取一个数据后,您可以调用另一个请求。
  3. 之后,您可以在全局范围内创建一个广播操作,该操作将始终调用每个更改的网络。
  4. 在后台,您可以再次同步数据并将其保存到共享首选项或根据您的要求。
  5. 对于间隔,您也可以使用 AlarManager。

其中一部分您可以使用 JobSheduler 简单地创建服务,您还可以分配工作和时间。

参考链接:

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

希望这个逻辑对你有所帮助。

【讨论】:

    【解决方案3】:

    您必须使用带有粘性的意图服务而不是服务,这将在队列中执行并完成您的工作。而且由于它是一个意图服务,它会在一段时间后自动启动,当系统终止服务进程时。

    【讨论】:

    • 意图服务将处理一次数据并完成其执行,只要应用程序正在运行,我需要该服务一直在运行。如果是意图服务,我需要启动该服务每次需要处理的东西。
    • 写一个定时器,如果你需要,它会定期启动intent服务。
    • 我编辑了问题,请看一下,因为聊天应用程序是实时的,所以计时器不是一个好主意。
    • 我相信 JobIntentService 现在是 Android 用于此实例的建议类型。它通过实现 IntentService 向后兼容较低的 API 级别,并通过 JobScheduler 支持 API 25 及更高版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多