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