まだ調査中ではあるのだけど、そんな動作をするようだ。
例えば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
を見ると、少しわかると思う。
コメント
[…] https://swingingblue.sakura.ne.jp/blog/archives/002768.html […]
[…] androidのActivityやServiceは、不安定過ぎると起動させてもらえなくなる? – きままな日記帳 […]