androidのActivityやServiceは、不安定過ぎると起動させてもらえなくなる?

まだ調査中ではあるのだけど、そんな動作をするようだ。

例えば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を再起動してくれなくなる。

この時、

  1. ActivityからのstartServce()やbindService()
  2. 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

を見ると、少しわかると思う。

タイトルとURLをコピーしました