2011年6月28日火曜日

終了しないサービスについて

automatonの常駐処理は以下のような流れで動作しています。


・初期起動
BOOT_COMPLETEDの受信→サービス起動→スレッド起動
設定画面からのAlarmManagerセット(現在時刻指定)→サービス起動→スレッド起動
・継続処理
スレッド処理終了時の次回AlarmManagerセット(次回時刻指定)

要するにAlarmManager頼りなのですが、これがタスクキラー系のアプリで殺すとリセットされちゃうんだよなーってググル先生に聞いたらちょうどいい内容がMLで取り上げられてました。
(タスクキルするのはOS2.1ぐらいまでのようなので、自分の端末(Xperia X10)がバージョンアップしたら用済みの話題なんですが、用済みのはずなんですがdocomoェ)

ML→終了しないサー ビスの作り方

知りたい情報だけ抜粋すると
・ユーザのタスクを切りたいという意思に反してサービスを常駐するのはよくない
・タスクを切るとアラームも死ぬ
・死ぬと困るタスクならstartForeground、OnGoingのNotificationでユーザに伝えておけ
といったところかな

MLのアプリケーションの強制停止してもAlarmManagerが再起動するよってコメントがあるけど、アプリケーションの強制停止とサービスの停止って別物なのかな。
っておもってiMoniがちょうどサービスで常駐してたので確認してみた。
・iMoniをいったん操作する
・アプリケーション→実行中のサービスからiMoniのサービスがいるのを確認する
・commantalbでiMoniがいるのを確認する
・commantalbでiMoniをキル
・アプリケーション→管理からiMoniのサービスを確認する
でサービスがいなくなった。
やっぱり無理っぽい?

ちょっとスキルが整ったらステータスかどこかで処理中表示するようにしておきたいなぁ。


あれ、今の実装で

BOOT_COMPLETEDの受信→サービス起動→スレッド起動
スレッド処理終了時の次回AlarmManagerセット(次回時刻指定)
スレッド終了でthis.stopSelf→サービス終了
としているときに、
commantalbで表示されない、かつ実行中サービスにも表示されない
ってことはぎりぎりたまたまタスクがキルされなくてAlarmManagerが生きている状態?
一応動いてるけど、なんだか怪しいなぁ。

ところで、Mailing List Archiveって公式じゃないよね。
ぐぐったら引っかかるからまあいいやとこっち参照してるけどよくないかなーとかおもいつつもにょもにょ。

0 件のコメント:

コメントを投稿