前回に続いてAIDLのお話です。今回はCallbackしてみます。
流れとしては、
- ActivityでServiceをBind
- ServiceのCallback登録Interfaceをコール
- Serviceに実装したCallback登録Interfaceで、受け取ったCallback情報をリストに登録
- Callbackリストを参照して登録されているCallback Interfaceをコール
- Activityに実装したCallback Interfaceでなんかする
みたいな感じです。
図にするとこんな感じ。

続きを読む…
タイトルにあるとおり、Activity – Service間の通信のお話です。
andoridでは、簡単にActivityからServiceのメソッドを実行することができます。
- AIDLファイルにIPCのインターフェイスを記述する
- Serviceにインターフェイスを実装する
- ActivityからServiceにBindし、インターフェイスを叩く
たったこれだけです。
サンプルとして、テキストボックスに入力された値をServiceで加算するプログラムを作ってみます。
こんな感じ。

続きを読む…
androidはユーザがアプリプロセスの終了を意識しない作りとなっています。
戻るボタンやホームボタンを押すとホーム画面に戻り、不要となったアプリプロセスはOSがテキトーなタイミングで殺します。
OSに殺されたくないときはServiceを作ってあげれば良いのですが、OSが勝手にServiceプロセスを再起動することがあるっぽいです。
Serviceでタイマーを仕掛けて周期的に処理を行っていたのですが、この周期的な処理が途切れてしまう現象が発生しました。
DDMSでプロセスをチェックしてみると、なんとタイマースレッドが死んでました ?(^o^)/
onCreate(), onStart(), onDestroy()にログを仕掛けて放置してみると、何も操作していないのにonCreate()がコールされてる・・・。
しかも、元のServiceプロセスのonDestroy()や新しいServiceプロセスのonStart()はなしです。
android:process属性を設定して別プロセスにしてみましたが、あえなくお亡くなりに。
まとめると以下のような感じ。
- ServiceプロセスはOSが再起動することがある。
- Serviceプロセスの再起動時には、新しいプロセスのonCreate()のみが呼ばれる。
- Serviceプロセスを別プロセスとしても再起動が発生する。
ちなみに、音楽プレイヤーとかのガリガリ動く物は再起動されることはないと思います。
長時間アイドル状態となっているから殺されるのでしょう。