Android Serviceのメモ。onBind,onRebind,onUnbindが呼ばれる条件
onBindやonUnbindが呼ばれるタイミングが紛らわしかったのでメモ。
個人的にこんな感じだと解釈している。
間違っているところは指摘していただけると助かります。
基本
Serviceは2形態、3つの状態になりうる
- Started
- Bound
- Started + Bound
Started状態のServiceは、stopServiceやstopSelfなどで明示的に停止しないと終了しない。
Bound状態のServiceは、バインドしているクライアントがいなくなったタイミングで終了する。
Started+Bound状態では、上記2つの条件を満たす場合に終了する。
クライアント側が利用するメソッド
- startService
- ServiceをStarted状態にする。インスタンスがなければ作成を要請する。
- bindService
- ServiceをBound状態にする。インスタンスがなければ作成を要請する。また、Serviceと通信するためのIBinderインターフェースはシステムからコピーされたものが渡される。
- stopService
- Started状態のServiceに「終了しても構わないよ」フラグを立てる。条件が良ければ、その後Serviceは終了する。
- unbindService
- バインドを解除する。この時、条件によってはServiceも終了する。
Serviceのコールバックメソッドが呼ばれるタイミング
- onCreate
- Serviceのインスタンスがない状態で、クライアントがstartServiceまたはbindServiceを呼んだ時にServiceのインスタンス生成で呼ばれる。すでにインスタンスが存在している場合は呼ばれない。
- onStartCommand
- startServiceが呼ばれるたびに呼ばれる。
- onBind
- 最初のbindService呼び出しのみ、システムにIBinderインターフェースを渡すために呼ばれる。
- onUnbind
- バインドしているクライアントが「全て」いなくなったとき。そのためunbindServiceが呼ばれても、ほかにバインドしているクライアントが存在した場合、onUnbindは呼ばれない。
- onRebind
- 「onUnbindの戻り値がtrue」かつ、一度「onUnbindが呼ばれた後」に、bindServiceが呼ばれた場合に呼ばれる。
- onDestroy
- 後述
onDestroyのタイミング
状態に応じて呼ばれる条件が異なる。
- Started
- stopSelf,stopService呼び出しなどの後
- Bound
- バインドされたクライアントがなくなって、onUnbindが呼ばれたあとに呼ばれる
- Started+Bound
- Serviceにクライアントがバインドしていない、かつ、stopServiceなどで終了フラグが立っているときに呼ばれる。
なお、stopServiceの後にstartServiceを呼ぶと、再びStopServiceなどが呼ばれないと終了しない。また、startServiceとstopServiceは同数呼ぶ必要はない。
最終的にstartServiceの後にStopServiceが呼ばれている状態にすればいい。
めも
bindServiceを呼んでも、Serviceのコールバックメソッドが必ず呼ばれるわけではない。
Service側でバインドされた時にチェックを入れたい場合、一度onUnbindを呼び出す必要がある。
でないと、複数回bindServiceでバインドしても、onRebindが呼ばれないので注意が必要。
なおServiceと接続すると、クライアント側で実装するServiceConnectionのonServiceConnectedが呼ばれるので、クライアント側からは接続したことはわかる。
また、ServiceConnectionのonServiceDisConnectedは、バインドが「意図せず」解除されたときのみ呼ばれる。
したがって、unbindServiceの呼び出しで明示的に解除した場合は呼ばれない。
ひとまず、ここまで
関連記事
-
AndroidStudioでコピペする方法。デフォルトではクリップボードから貼り付けできない
AndroidStudioでは外部アプリからのコピペがデフォルトだと出来ない。 …
-
Androidでクリップボード処理、HTMLタグもコピーしていた。
今回はAndroidでクリップボードの内容を取得する。本家ガイドのメモ。 詳しい …
-
タイマーアプリを作ってみる
とりあえず、シンプルにタイマーアプリでも作ってみる。 あらかじめ用意されているク …
スポンサーリンク
週間人気記事
AndroidStudioでコピペする方法。デフォルトではクリップボードから貼り付けできない
[Win]+[Print]知らなかった。スクショってそのまま保存出来たんだ。