2011-11-05 79 views
86

如果我有以下代码:如果服务多次启动会发生什么?

Intent intent = new Intent(this,DownloadService.class);  
for(int i=0;i<filesArray.length;i++){   
    startService(intent);   
} 

在这段代码DownloadService延伸IntentService

所以现在当我打电话startService(intent)这是不是意味着我开始了新的服务,每次startService(intent)被称为或是否意味着DownloadService运行一次,然后每次我打电话时startService(intent)它只是通过不同意图与不同的startId。

这是否有意义,这是哪种情况?

回答

123

服务将只在一个实例中运行。但是,每次启动服务时,都会调用onStartCommand()方法。

这是记录here

+1

谢谢。它还表示:“startService()方法立即返回,Android系统调用服务的onStartCommand()方法。如果服务尚未运行,系统首先调用onCreate(),然后调用onStartCommand()。因此,如果服务已经在运行,那么系统将跳过onCreate()方法并仅调用onStartCommand()或者什么? – bytebiscuit

+0

我真的不知道,但我很确定是这种情况(如果服务已经创建,使得很多人不会调用'onCreate()')。应该很容易确定是否在两个回调中都放置了Log.i(),并检查LogCat。 –

+0

刚刚做到了这一点......奇怪的是,它在最后一次startService()调用后启动了onCreate! – bytebiscuit

7

完全正确的。 仅为应用程序进程创建一个服务实例。 而当你打电话onStart();再次,只有onStartCommand()被调用,并且新的Intent被传递给onStartCommand()方法。

注意: onCreate()不会再次被调用。

关于调用bindService()多次:

当你调用bindService()多次,然后再用于服务只有一个实例和Android运行时返回相同的IBinder对象客户。

均值,onBind()不会被多次调用。并且只返回缓存的IBinder对象。

+0

是否必须为每个相应的'onStartCommand'调用'onStop()'? –

+6

@IgorGanapolsky:首先,Service中没有onStop()这种回调方法。我们需要调用stopService()或stopSelf()来停止服务。当onStartCommand()多次被多次调用时,我们只需要调用stopSelf()或stopService()一次。如果使用IntentService,则应该调用stopSelfResult(int id)传递来自onHandleIntent()的请求的开始标识,这将停止相应的启动id请求,该请求位于IntentService的工作队列中。希望这可以帮助。 –

2

向上面的答案添加一些可能对别人有用的信息是,startId onStartCommand()方法接收的每个startService()调用都不相同。同样,如果我们在上面提到的for循环中写入,使用onHandleIntent()编写的代码将按照for循环频率定义的次数执行,但是按顺序而不是并行执行.IntentService的概念创建一个工作队列,并且每个请求都会启动()触发onStartCommand(),然后将意图存储在工作队列中,然后将意图逐一传递给onHandleIntent()。

相关问题