「そのサービスでAndroidサービスを開始するとstartService(..)
、明示的に呼び出すまでstopService(..)
実行されたままになります。サービスがシステムによって実行される理由は2つあります。誰かが呼び出すとContext.startService()
、システムがサービスを取得します(作成してそのonCreate()
メソッドを呼び出す場合はonStartCommand(Intent, int, int)
クライアントから提供された引数を使用してそのメソッドを呼び出します。この時点で、サービスは、Context.stopService()
またはstopSelf()
が呼び出されるまで実行を続けます。Context.startService()
入れ子にしない複数の呼び出しはネストしないことに注意してください(ただし、対応する複数の呼び出しが発生するためonStartCommand()
)、サービスが開始される回数に関係Context.stopService()
かstopSelf()
呼び出されますが、サービスはstopSelf(int)
開始されたインテントが処理されるまでサービスが停止しないようにする方法。
クライアントは、を使用Context.bindService()
してサービスへの永続的な接続を取得することもできます。同様に、まだ実行されていない場合はサービスを作成します(実行onCreate()
中に呼び出しonStartCommand()
ます)が、呼び出しません。クライアントはIBinder
、サービスがそのonBind(Intent)
メソッドから返すオブジェクトを受け取り、クライアントがサービスにコールバックできるようにします。接続が確立されている限り、サービスは実行されたままになります(クライアントがサービスの参照を保持しているかどうかは関係ありませんIBinder
)。通常、IBinder
返されるのはAIDLで記述された複雑なインターフェースです。
サービスは開始することも、接続をバインドすることもできます。そのような場合、システムは、サービスが開始されているか、Context.BIND_AUTO_CREATE
フラグを使用してサービスに1つ以上の接続がある限り、サービスを実行し続けます。これらの状況のどちらも成立しないと、サービスのonDestroy()
メソッドが呼び出され、サービスは効果的に終了します。から戻ると、すべてのクリーンアップ(スレッドの停止、レシーバーの登録解除)が完了する必要がありますonDestroy()
。