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

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

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

関連する記事:

  1. AndroidでJavaとNativeとのやり取り(JNIは絶対必要?Socketなどは…?) 本家フォーラムにちょっと興味深いネタが。 Registering a java method as a callback function -...
  2. Galaxy Sでカメラ画像をネットワークに流せない問題について調べる カメラの映像をネットワークに流そうとしたが… – きままな日記帳 昨日のこの件の続きをもう少し調べてみる。 問題の切り分けとしては、MediaRecorder#setOutputFile()にFileDescriptorで物理ファイルを指定した場合とSocketを指定した場合。 123Socket socket = new Socket(DEST_ADDR,...
  3. MacPortsでTomcatをインストールしてみた(2) やっぱりTomcatのデーモンは自動起動はしてなかったようだ。 ターミナルでコマンドを叩いたときに起動していたらしい。コンソールにはエラーで途中終了したように見えていたけど。 あと、MacPortsでTomcatをインストールした場合は、/opt/local/share/java/tomcat5/conf以下にある.sampleの設定ファイルをそれぞれリネームしておかないといけない。とりあえずそれ......
  4. androidの起動中のプロセス一覧を見てみた Androidを少し調査中。 コマンドラインからエミュレータ起動後、別のコマンドラインから adb shell とやれば、エミュレータのシェルにリモート接続できる。 とりあえず、エミュレータが起動した時の内部プロセス一覧を見てみた。思ったより少ないな...。エミュレータだからかなぁ。 ハードウェアを叩くような機能も、アプリのプロセスからNativeライブラリ経由ってことだからか?Nativeライブ......
  5. AndroidのMadiaPlayerはSurfaceをどうやってNativeに渡しているか? 本家フォーラムより。 Surface to Native - Android Developers | Google Groups...
  6. JNIでnativeからJavaをコールバックするには?…JNIは分かりづらい Callback mechanism from native to java ?? - android-ndk |...

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://www.swingingblue.net/mt/archives/002768.html/trackback
トラックバックの送信元リスト
androidのActivityやServiceは、不安定過ぎると起動させてもらえなくなる? - きままな日記帳 より

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

検索
フィード
メタ情報

ページの上部に戻る