検索で Android の Service 関連の情報を探していると、しばしば「常駐」というキーワードが出てきます(2011年5月現在)。そしてそれはどちらかというと「Serviceは常駐するものだろうに、よく落ちるよー。ちゃんと落ちないようにするには工夫が必要だよー。やっかいダヨネー」という雰囲気のものが多いように思います。
私も最初はそう思っていたのですが、よくよく Service 周りを調べてみると、どうもちょっと違うようです。で、今は次のような考えが正しいと思っています。
「Android の Service は、何らかの常駐的な機能を提供するコンポーネントでは無い」
で、それでそう考えると、例えば次のような、Service の仕様もしっくり納得できます。
- startService は別スレッドで実行されるわけじゃない
- stopSelf しなくても、いつの間にか kill されて落ちてたりすることもあったりする
- Service が kill されて再起動した時、onCreate は呼ばれるが、onStart は呼ばれない
まぁ、そう気付いてから↓改めてリファレンスを見ると、なんとなくそういうことが書いてあったりして、ちょっとお恥ずかしい感じです……。(*^ ^*;
http://developer.android.com/intl/ja/reference/android/app/Service.html#WhatIsAService
(↓What is a Service? の部分の翻訳が含まれている記事もありました)
http://d.hatena.ne.jp/adsaria/20100914/1284435095
でもちょっと遠まわしな記述ですよね?(私、最初は意味がわからずに読み飛ばしてました)
で、そんなことに気付いたところで、あんまり意味も無いものかも知れませんが、私個人的には、最初にどう作ろうか考えている時点で、早めに正しい方向性を見出せるような気がいたします。
では常駐はどう作るか?
ってか、そもそも「常駐」って言葉の定義も結構曖昧ですが(笑)、例えば、定期的なプログラムの実行であれば AlarmManager を利用するのが良さそうです。また、外部からの何らかのアクションに対応するには、BroadcastReceiver を使うのが良さそうです。
以上でーす。久しぶりの記事がこんなんですみません。(^ ^;
でも、とりあえず、Service が「常駐」のための正しい手段だと思ってると、ちょっぴり問題のある設計をしていまいそうにも思ったので、それだけです。
ではー。
追記です。
ブックマークしてくださった方のコメントに、「 『Android の Service は、何らかの常駐的な機能を提供するコンポーネントでは無い』 メモリが足りなくなったりしない限り、サービスは残ると思っていた。」とありましたので、補足ですが、基本、startService すれば、stopService しない限り、service は起動していると思います。
ただ、再起動したらサービスは落ちてますし、メモリが足りなくなってキルされたりしたときの挙動とか見ていると、「『Serviceが常駐の為の機能』と思っていると、間違った設計をしてしまう可能性がある」ことや「Serviceそのものを有効に利用できない」ということを記事には書いているつもりでした。誤解のありませんように、です♪
>BroadcastReceicer
typoのようです。
修正しました。ご指摘ありがとうございましたー。 (‘ヮ^*)ノ゙フリフリ.:゚+