首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >START_STICKY和START_NOT_STICKY

START_STICKY和START_NOT_STICKY
EN

Stack Overflow用户
提问于 2012-02-01 17:12:28
回答 4查看 193.3K关注 0票数 293

在安卓上实现服务时,START_STICKYSTART_NOT_STICKY有什么区别?谁能指出一些标准的例子..?

EN

回答 4

Stack Overflow用户

发布于 2012-02-25 14:13:27

这两个代码仅在手机内存耗尽并在完成执行之前终止服务时才相关。START_STICKY告诉操作系统在它有足够的内存后重新创建服务,并使用空意图再次调用onStartCommand()START_NOT_STICKY告诉操作系统不要再费心重新创建服务了。还有第三个代码START_REDELIVER_INTENT,它告诉OS重新创建服务,并将相同的意图重新传递给onStartCommand()

Dianne Hackborn的这篇文章比官方文档更好地解释了这一背景。

来源:http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

这里的关键部分是函数返回的新结果代码,它告诉系统,如果服务的进程在运行时被终止,它应该如何处理服务:

START_STICKY与之前的行为基本相同,即服务保持“启动”状态,稍后将由系统重新启动。该平台与以前版本的唯一不同之处在于,如果由于其进程被终止而重新启动,则将在下一个服务实例上以null意图调用onStartCommand(),而不是根本不调用。使用此模式的服务应始终检查这种情况并进行适当的处理。

START_NOT_STICKY说,从onStartCreated()返回后,如果进程被终止,没有剩余的启动命令可供交付,那么服务将停止,而不是重新启动。对于那些只打算在执行发送给它们的命令时运行的服务来说,这更有意义。例如,服务可以从警报开始每15分钟启动一次,以轮询某些网络状态。如果它在执行该工作时被杀死,最好是让它停止,并在下一次警报触发时启动。

START_REDELIVER_INTENT类似于START_NOT_STICKY,除非服务的进程在为给定的意图调用stopSelf()之前被终止,那么该意图将被重新传递给它,直到它完成(除非在多次尝试之后它仍然无法完成,此时系统放弃了)。对于正在接收要做的工作的命令,并希望确保它们最终完成发送的每个命令的工作的服务来说,这很有用。

票数 403
EN

Stack Overflow用户

发布于 2015-11-28 15:58:11

KISS应答

区别:

START_STICKY

系统将在终止服务后尝试重新创建该服务

START_NOT_STICKY

在您的服务被终止后,系统将不会尝试重新创建该服务

标准示例:

代码语言:javascript
复制
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
票数 120
EN

Stack Overflow用户

发布于 2012-02-02 03:49:38

START_STICKYSTART_NOT_STICKY的文档非常简单。

START_STICKY:

如果此服务的进程在启动时被终止(从onStartCommand(Intent, int, int))返回后,则将其保留在已启动状态,但不保留此提交的意图。稍后,系统将尝试重新创建服务。由于处于started状态,创建新的服务实例后会保证调用onStartCommand(Intent, int, int);如果没有任何挂起的启动命令要下发给服务,则会使用空的intent对象进行调用,因此一定要注意检查。

此模式适用于将显式启动和停止以运行任意时间段的内容,例如执行背景音乐回放的服务。

示例:Local Service Sample

START_NOT_STICKY:

如果此服务的进程在启动时被终止(在从onStartCommand(Intent, int, int))返回后,并且没有新的启动意图要传递给它),则使服务脱离已启动状态,并在将来显式调用Context.startService(Intent)之前不重新创建。该服务将不会接收带有null意图的onStartCommand(Intent, int, int)调用,因为如果没有要传递的挂起意图,则不会重新启动该服务。

这种模式对于那些由于启动而想要做一些工作的事情是有意义的,但在内存紧张时可以停止,并且稍后将显式地重新启动以做更多的工作。此类服务的一个示例是从服务器轮询数据的服务:它可以通过让警报启动其服务来安排警报每隔N分钟轮询一次。当从警报中调用它的onStartCommand(Intent, int, int)时,它会在N分钟后调度一个新的警报,并产生一个线程来进行联网。如果它的进程在执行该检查时被终止,该服务将不会重新启动,直到警报响起。

示例:ServiceStartArguments.java

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9093271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档