Androidサービスが複数回開始された場合はどうなりますか?


120

次のコードがある場合:

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で異なるインテントを渡すだけです。

これは理にかなっていますか、そしてこれらのどれがそうですか?

回答:


167

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

これはここに文書化されています


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

本当にわかりませんが、そうだと確信しています(onCreate()サービスが既に作成されている場合は、呼び出しを行わないようにするのは当然です)。Log.i()両方のコールバックにを入れ、LogCatを確認するのは簡単です。
フィリップウェント

ちょうどそれをしました...そして奇妙なことに、それは最後のstartService()呼び出しの後にonCreateを開始します!!!
bytebiscuit

15
それはstartService()非同期だからです。したがって、呼び出しをループしている間、サービス自体にはリソースがなく、まだ開始されていません。
フィリップウェント

1
@neelabhは「すぐに」ではなく、サービスを開始するのにしばらく時間がかかります。「for」ループはまだ実行中であり、何度もサービスを呼び出しているため、最初の試行ではまだ実行中のサービスが見つかりません...そのため、サービスの起動が完了するまで、メソッドstartService()が数回呼び出されます。私の悪い英語を許しなさい。
mzalazar 2016

21

絶対に正しい。アプリケーションプロセスに対して作成されるサービスのインスタンスは1つだけです。そして、StartService();もう一度呼び出すと、onStartCommand()呼び出されるだけで、新しいIntentがonStartCommand()メソッドに渡されます。

注: onCreate()は再度呼び出されません。

bindService()複数回の通話について:

bindService()複数回呼び出すと、サービスには1つのインスタンスのみが使用され、Androidランタイムは同じIBinderオブジェクトをクライアントに返します。

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


onStop()対応するものごとに呼び出す必要がありonStartCommandますか?
IgorGanapolsky

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

8

上記の答えに他の人に役立つかもしれないいくつかの情報を追加するstartIdと、onStartCommand()メソッドが受け取るstartService()呼び出しは呼び出しごとに異なります。

また、上記のようにforループで書き込む場合、書き込まれたコードonHandleIntent()はforループの頻度で定義された回数だけ実行されますが、並列ではなく順番に実行されます。

コンセプトはIntentService、ワークキューとstartService()トリガーonStartCommand()する各リクエストを作成し、インテントをワークキューに格納して、インテントを1つずつに渡しますonHandleIntent()


2

ドキュメントによると:

startService()メソッドはすぐに戻り、AndroidシステムはサービスのonStartCommand()メソッドを呼び出します。サービスがまだ実行されていない場合、システムは最初にonCreate()を呼び出し、次にonStartCommand()を呼び出します。

そして

サービスを開始する複数の要求により、サービスのonStartCommand()への対応する複数の呼び出しが発生します。ただし、サービスを停止するには(stopSelf()またはstopService()を使用して)サービスを停止する要求が1つだけ必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.