2015年2月21日土曜日

ServiceのonRebind()の振る舞い

ServiceのonRebind()の振る舞い

Activityが終了した時、同時にServiceも終了させるというのが一般的であろう。
ただし、アプリの仕様によっては、Activityの終了後もServiceを稼働させたい場合がある。
つまり、「Activityとの通信を行うこと」と「Service独自の業務を行うこと」の2個の業務をServiceが担っている場合である。
これを行うため、一方で、Activity-Service間のbindを確立させ、他方で、(Activityは)Serviceに対してダミーで(何もしない)Intentを発行しonStartCommand()を実行させる。こうすることによりonUnbind()後もServiceは終了はしないようになる。

onRebind()を実装しない場合の流れ
ActivityとServiceとをbindさせた後、Activityを終了させ、このServiceが生きた状態で、再度同じActivityを起動させ、再度同じServiceにbindService()した場合、Serviceにおいては、onBind()もonUnbind()も呼ばれない。
第2回目のActivityの起動でも、onServiceConnected()が呼ばれており、Activity-Service間の通信は行える。
通信だけが行えれば良いのであれば、onRebind()を設けなくても良い。

onRebind()を実装した場合の流れ
ServiceのonUnbind()においてtrueを返すようにした場合、第2回目に起動したActivityがServiceと通信をすると、Serviceにおいて、Activityの開始時にonRebind()が、Activityの終了時にonUnbind()が呼ばれる。onBind()は呼ばれない。

onRebind()が呼ばれるのは、ServiceがActivityと生死を共にしないように仕込んだ場合である。生死を共にすると、onRebind()は呼ばれることはない(当たり前)。

教科書には、Activityの死後直後に、再度Activityを起動-接続させるように書いてあるように思えたが、Activityの死後数時間後に接続させても問題はない(Serviceが生きていれば)。

onRebind()を実装する意義
Activity-Service間で接続-分離が繰り返される場合、その接続-分離のタイミングを捉えたい場合に使うのである。
Activityは定時で退社してしまうのに対して、Serviceは残業して残務整理をしなければならない場合があるだろう。残務整理をしていたら、気が付けば翌朝になっていて、Activityが出勤して来たっていう場合があるだろう。
Activityは定時に出勤-退社を繰り返しても良いが、Serviceは自分の仕事も終えなければ退社してはいけないのである。
onBind()、onRebind()及びonUnbind()を使ってActivityの出勤-退社のタイミングを捉えることにより、Serviceは自身の退社の時を自分で決定できる。

0 件のコメント:

コメントを投稿