変化を求める人

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の呼び出しで明示的に解除した場合は呼ばれない。

ひとまず、ここまで

 - android - api , ,

スポンサーリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

AndroidStudioでコピペする方法。デフォルトではクリップボードから貼り付けできない

AndroidStudioでは外部アプリからのコピペがデフォルトだと出来ない。 …

Androidでクリップボード処理、HTMLタグもコピーしていた。

今回はAndroidでクリップボードの内容を取得する。本家ガイドのメモ。 詳しい …

タイマーアプリを作ってみる

とりあえず、シンプルにタイマーアプリでも作ってみる。 あらかじめ用意されているク …