- 2009年12月21日 00:57
- Technical

まだ調査中ではあるのだけど、そんな動作をするようだ。
例えばandroidのServiceは、常駐させたりして使うこともある。そんなServiceが何らかの原因で例外を吐いて落ちたとき、1度目であればActivityManagerが5000ms以上の間隔を開けた後に再起動してくれる。
WARN/ActivityManager(53): Scheduling restart of crashed service net.swingingblue.testservice/.TestService in 5070ms
でも再起動したあと、さらに例外を吐くと、
WARN/ActivityManager(53): Service crashed 2 times, stopping: ServiceRecord{43c14178 net.swingingblue.testservice/.TestService}
と表示され、"stopping"という状態になる。この状態になるとActivityManagerはServiceを再起動してくれなくなる。
この時、
- ActivityからのstartServce()やbindService()
- AlarmManagerからのIntent発行
でServiceは再び起動するのだけど、それが無い限りServiceは動作しない。
また、60秒の間に2度死ぬようなことがあると、
WARN/ActivityManager(53): Process net.swingingblue.testservice has crashed too many times: killing!
と"crashed too many times"となり、こうなるとAlarmManagerでintent発行によるService起動は
WARN/ActivityManager(53): Unable to launch app net.swingingblue.testservice/10024 for service Intent { act=net.swingingblue.testservice.TestService cmp=net.swingingblue.testservice/.TestService }: process is bad
と"process is bad"として内部で蹴られてしまう。
この状態でも、ActivityからのstartService()やbindService()は有効なのだけど、常駐サービスとしてServiceを使っていて、かつAlarmManagerで自分自身にIntentを飛ばしてるような場合だとエラー時にシステムに救済されるのは最悪1回のみ(60秒間に2度エラー吐くと起動禁止)ということになる。
常駐型のServiceを作ろうと思っている人は気をつけたほうが良いかも。
また、この辺のActivityやServiceの起動管理は、androidのソースの
mydroid/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
を見ると、少しわかると思う。
- Newer: 「本気」で仕事をする海外の人達に対抗できるか
- Older: イーバンクのVisaデビットが年会費必須に
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- http://www.swingingblue.net/mt/mt-tb.cgi/2340
- Listed below are links to weblogs that reference
- androidのActivityやServiceは、不安定過ぎると起動させてもらえなくなる? from きままな日記帳