Services on Android
Android 入門してすぐの頃、自分は Android の Service についてまったくよくわかっていなかった。色々誤解していた。その誤解をといたプロセスを思い出しつつ書いてみる。
まず、最初は Service はアプリ (Activity) とは別のプロセスだと思っていた. これは完全に間違いではない (別プロセスにもできる) が、大抵の場合 Activity と Service は同じプロセスで動く。VM がわかれたりもしない。自分がなそんな誤解をしていたのは, Android Chrome が renderer のためにこのプロセス分離 Service を使っているのを見ていたからだと思う。
プロセスモデルの誤解がとけたあとの思い込みは、Service の API 定義には AIDL (かインテント) を使わなければいけない、というもの。同一の VM 内にいるのだから参照を取れば呼べるのだけれど、参照の取得はすごく難しくしてあると信じていた。が、これも誤解で、普通に サービスオブジェクトのインスタンスを持ってきて Java のオブジェクトとしてメソッドコールできる。Local Service とか呼ばれている。プロセスをわけないなら AIDL を使うよりは Java として使ったほうが全然ラク。特に状態の変更を push するみたいな非同期な奴は AIDL だと大変。
プロセスはわかれていないし AIDL も必要ない。でもそれならなぜわざわざ Service なんて仕組みを使うのか。というと、Activity のライフサイクルとは別にプロセスの寿命を指示する仕組みが欲しかったからだよな。たぶん。これはすごい narrow な見方ではあるけれど、多くの実用をカバーしている見方だとも思う。
もちろん他のプロセスから Intents を受け取りたいという要求を満たすための機能でもあるというかそれがメインだし、Intent-based のコミュニケーションはプロセス内でも便利ではある。それはそれ。