2011-11-05 5 views
86

は、私は次のコードをお持ちの場合:このコードではサービスを複数回起動するとどうなりますか?

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

DownloadServiceIntentServiceを拡張します。だから、

今私はそれは私が毎回startService(intent)が呼ばれる新しいサービスを始めているか、それはDownloadServiceが一度に実行されていることを意味し、その後、私は呼び出すたびにstartService(intent)それだけで異なるに合格することを意味していstartService(intent)を呼んでいるとき別のstartIdでインテントします。

これは意味がありますか、どちらが当てはまりますか?

答えて

123

サービスは1つのインスタンスでのみ実行されます。ただし、サービスを開始するたびにonStartCommand()メソッドが呼び出されます。

これは絶対に正しいhere

+1

ありがとうございました。 「startService()メソッドはすぐに戻り、AndroidシステムはサービスのonStartCommand()メソッドを呼び出します。サービスがまだ実行されていない場合、システムは最初にonCreate()を呼び出し、次にonStartCommand()を呼び出します。したがって、サービスが既に実行されている場合、システムはonCreate()メソッドをスキップし、onStartCommand()のみを呼び出すか、何を呼び出すのでしょうか? – bytebiscuit

+0

私は本当に知っていませんが、それが本当であると確信しています(サービスがすでに作成されている場合は 'onCreate()'を呼び出さないようにしましょう)。両方のコールバックに 'Log.i()'を入れてLogCatをチェックするのは簡単です。 –

+0

ちょうどやった...と不思議にも、最後のstartService()コールの後にonCreateを開始します!!! – bytebiscuit

7

を文書化されています。 アプリケーション・プロセスのServiceインスタンスは1つだけ作成されます。 そして、あなたがonStart()を呼び出したとき。再びonStartCommand()が呼び出され、新しいIntentがonStartCommand()メソッドに渡されます。

注: onCreate()は再び呼び出されません。呼び出しについて

bindService()を複数回:あなたはbindService()を複数回呼び出すと、再び一つだけのインスタンスがサービスのために使用されており、Androidのランタイムがクライアントに同じIBinderオブジェクトを返します

つまり、onBind()は複数回呼び出されません。そしてキャッシュされたIBinderオブジェクトだけが返されます。

+0

対応する 'onStartCommand'ごとに' onStop() 'を呼び出さなければなりませんか? –

+6

@IgorGanapolsky:まず、Serviceのstop()コールバックメソッドはありません。サービスを停止するには、stopService()またはstopSelf()を呼び出す必要があります。また、onStartCommand()が複数のインテントに対して複数回呼び出された場合は、stopSelf()またはstopService()を1回だけ呼び出す必要があります。 IntentServiceを使用する場合は、onHandleIntent()からの要求の開始IDを渡すstopSelfResult(int id)を呼び出す必要があります。これは、IntentServiceの作業キューに配置された対応する開始ID要求を停止します。お役に立てれば。 –

2

上記の回答にいくつかの情報を追加すると、onStartCommand()メソッドが受け取るstartIdはすべてのstartService()呼び出しごとに異なることになります。また、onHandleIntent()で書かれたコードは、前述のようにforループで記述した場合、forループの頻度で定義されているように繰り返し実行されますが、並列ではありません。概念はIntentServiceで、作業キューとstartService ()はonStartCommand()をトリガーし、インテントを作業キューに格納し、次にインテントをonHandleIntent()に1つずつ渡します。

関連する問題