无限期地创建服务 运行 并与 activity 通信

Make a service run indefinitely and communicate with activity

我无法理解 android 服务的差异

我想要一个服务运行一直在后台(activity识别)

当它检测到我 RUN -> open GPS -> save curent longitude latitude -> if I stopped to run (WALKING) -> display the log lat on my MainActivity

我想要服务 运行 如果用户关闭应用程序,如果设备关闭并重新打开,如果我的服务被终止

所以我读到:

[Started Service , Intent Service , Bound Service , Intent Bound Service , Job Scheduler , Job Intent Service].......但我还是漏掉了什么

我知道使用 Service start_sticky for API<26 将 运行 永远(如果没有被杀死)并且使用 IBinder 我可以更新 UI我的主要活动;对吧?

我的很多Q是...:[=​​32=]

1.绑定的服务可以运行永远吗?并更新我的 MainActivity UI?我需要绑定还是可以通过 service 或 intent service

实现

2.奥利奥我"must"用Job Scheduler->when killed->open again with broadcast receiver || work manager || alarm manager ||

我的问题更多的是理论答案而不是代码。

需要 -> "ever" 运行 -> if (something) -> 打开 gps -> save long lat -> 在 MainActivity 的 UI 中显示经纬度。

要在后台无限期保留 Service 运行ning,请使用 foreground service。这将迫使您保持可见的 notification/nav 栏图标;这是 Android 向您收取的价格,以换取您长期 运行 宁服务。 API 5+.

支持

JobScheduler/WorkManager/AlarmManager 不会 阻止 你的 Service 被杀死。它们可用于让您的 Service 起死回生。此外,JobSchedulerWorkManager 可以使您的系统脱离 doze, so you can do useful work. A WakeLock may also be necessary. If the user explicitly terminates your app, JobScheduler jobs will no longer wake it up. I don't know of any good, "Android-approved" way to resuscitate an app in this circumstance. Although, even on Oreo+, you can register to receive these intents,您可以使用它来重新执行。

您可以将您提到的任何 Service subclasses 设置为前台服务(通过调用 startForeground()。subclass 的选择是一个问题的方便,并取决于你想如何调度和安排你的工作。你的应用程序可以很容易地用 base-class Service.

来实现

START_STICKY 实际上并不能阻止 Service 停止。它更像是对系统的请求:"After you kill my app/service, please restart it, if/when you see fit"。在我看来,这不是长期保持 Service 运行ning 的有效方法。如果 Service 不在前台,并且前台没有其他应用程序组件(例如,在屏幕上),那么 Android 可以很快杀死您的应用程序。 OS (Oreo+) 的更高版本更是如此。

您的 Service 需要不时绑定到其他组件(例如 Activities)。您绑定到 Service 以便您可以 1.) 确保它存在和 2.) 与其进行通信(调用其上的函数等)。所以,是的,使用 IBinder,您可以更新 MainActivity 的 UI。

绑定 Service 并不能使它永远 运行。如果您的 Activity 绑定到 Service,您可以确信只要 Activity 在屏幕上,Service 就会一直存在。一旦它离开屏幕,所有赌注都将取消。

换句话说,Android 很可能会在 app/service 不在前台且未绑定到前台(屏幕上)的任何组件时杀死它。

A Service 通常可以在它选择的任何时间打开一个 Activity,只需调用 startActivity()。您的 Activity 甚至可以使用 FLAG_DISMISS_KEYGUARD.

关闭键盘锁(在某些情况下)

如果您可以忍受较少的位置更新频率,您可以在不留在前台的情况下执行此操作,but there are limitations