使服务无限期运行并与活动进行通信

时间:2018-12-02 15:16:28

标签: android service android-8.0-oreo

我无法理解android服务上的差异

我想让服务一直在后台运行(活动识别)

当它检测到我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] .......但是我仍然缺少一些东西

我了解到start_sticky的服务API<26将永远运行(如果未被杀死),而IBinder则可以更新MainActivity的UI;对吧?

我的许多Q是...:

1。。绑定服务可以永远运行吗?并更新我的MainActivity用户界面?我需要绑定吗,或者我可以通过服务或意图服务来实现此目的

2。。对于奥利奥,我“必须”使用Job Scheduler -> when killed -> open again with broadcast receiver || { {1}} work manager || alarm manager

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

需要||服务以“永远”运行->,如果(某事)->打开GPS ->保存长纬度->在UI中显示长纬度MainActivity。

1 个答案:

答案 0 :(得分:1)

要使Service在后​​台无限期运行,请使用foreground service。这将迫使您维护可见的通知/导航栏图标;这就是Android从您那里获取的价格,以换取您的服务长时间运行。在API 5+上受支持。

JobScheduler/WorkManager/AlarmManager不会防止您的Service被杀死。它们可用于使您的Service复活。另外,JobSchedulerWorkManager可以使系统脱离doze,因此您可以进行有用的工作。 WakeLock也可能是必需的。如果用户明确终止您的应用,则JobScheduler作业将不再将其唤醒。在这种情况下,我不知道有任何好的“ Android认可”方法可以使应用程序复苏。尽管,即使在Oreo +上,您也可以注册接收these intents,可以用来重新获得执行权。

您可以将提到的Service子类中的任何一个放入前台服务中(通过调用startForeground()。子类的选择是为了方便起见,取决于您希望如何分派&安排您的工作。使用基础类Service可以轻松实现您的应用。

START_STICKY实际上并没有阻止Service停止。这更像是对系统的请求:“在杀死我的应用程序/服务后,如果认为合适,请重新启动它”。我认为,这不是让Service长时间运行的有效方法。如果Service不在前台,并且没有其他应用程序组件在前台(例如,在屏幕上),那么Android可以很快杀死您的应用程序。在更高版本的OS(Oreo +)中更是如此。

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

绑定Service并不能使其永远运行。如果您的Activity已绑定到Service,则可以确信Service会一直停留在屏幕上Activity的时间。离开屏幕后,所有投注均关闭。

换句话说,Android很可能会在不位于前台且未绑定到位于前台(屏幕上)的任何组件的情况下杀死应用程序/服务。

Service通常可以在选择的任何时间打开Activity,只需调用startActivity()。您的Activity甚至可以使用FLAG_DISMISS_KEYGUARD解除键盘锁(在某些情况下)。

如果您可以容忍不太频繁的位置更新,则可以不必停留在前台but there are limitations