我无法理解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。
答案 0 :(得分:1)
要使Service
在后台无限期运行,请使用foreground service。这将迫使您维护可见的通知/导航栏图标;这就是Android从您那里获取的价格,以换取您的服务长时间运行。在API 5+上受支持。
JobScheduler/WorkManager/AlarmManager
不会防止您的Service
被杀死。它们可用于使您的Service
复活。另外,JobScheduler
和WorkManager
可以使系统脱离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。