START_STICKY和START_REDELIVER_INTENT的区别是什么?

21

我正在为我的Android应用程序创建一个服务,通过意图(Intent)向服务提供数据。问题是当系统销毁服务时,提供给服务的意图数据无法恢复,导致我的应用程序崩溃。

我听说 START_REDELIVER_INTENT 会在有足够内存可用时重新启动我的服务,并恢复提供给服务的意图数据,而 START_STICKY 不会恢复意图数据。

我是对的吗?还是我有什么不知道的地方?

此外,我的服务在被系统销毁后重新启动需要很长时间。

输入图像描述


为什么首先被您的系统停止了呢?您的设备内存不足吗? - IgorGanapolsky
2个回答

30

START_STICKY- 这将告诉系统,在可用内存足够的情况下创建服务的最新副本,并在从低内存中恢复状态后保留状态。在这个过程中,我们将会失去之前可能已经计算出来的结果。

START_REDELIVER_INTENT- 这将告诉系统在服务崩溃后重新启动并恢复服务,并重新传递在崩溃发生时存在的意图。

此外,我们还可以简要介绍一下START_NOT_STICKY

START_NOT_STICKY- 这将告诉系统不用担心重启服务,即使有足够的可用内存。

请访问以下网址了解更多信息:

http://developer.android.com/reference/android/app/Service.html


1
将服务设置为“前台”是否可以避免服务被杀死(除了极端的OOM!)? - nmxprime
1
这取决于你的使用方式,前台服务仍然可能被杀死,请访问https://dev59.com/NFnUa4cB1Zd3GeqPWgbQ。 - Jitesh Upadhyay
我认为,如果你们中的某些人能解释一下为什么要把它命名为STICK而不是STICKY,那将非常清晰明了。至少REDELIVER_INTENT非常直观易懂,但另外两个呢?这为什么被称为stick而不是sticky呢? - Neon Warge

-2
如果你正在重写 onstartCommand() 方法,那么你需要通过调用 stopSelf() 或 stopService() 命令主动停止它。

其实,你不一定非得停止它。 - Clocker
@Clocker,你必须调用stopSelf()stopService()来销毁服务,否则即使它没有运行,它的实例仍将在内存中保持活动状态。 - CopsOnRoad
旧线程,但是如果您的应用程序不再处于前台,则@Jack Oreo现在会为您调用stopSelf()。 - Clocker

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