@Azrael: 死ににくいサービス

ページ

2010年7月14日水曜日

死ににくいサービス

MarketHistoryManagerで自動削除を行うよう設定すると、
ContentResolverにContentObserverを登録し、
ContentProvider (この場合はアンドロイドマーケットの検索履歴)に
変更があった場合にコールバックを受け取るようにしています。

ContentObserverの仕組み自体は大変便利なのですが、
登録したプロセスがメモリ不足等によって殺された場合、
コールバックが呼び出されません。

そのため、Serviceの優先度にForegroundを設定することによって、
プロセスが殺され難いようにしています。
コールバックが呼ばれない限り処理が行われることは無いため、
CPU時間(バッテリー)は消費しませんが、
プロセスは常駐するため、メモリは消費します。

Serviceの優先度にForegroundを設定するには、
1.6以前はService#setForeground(true)を呼べばよかったのですが、
2.0以降ではService#startForeground()を呼ぶ必要があり、
通知領域にForegroundで起動中であることが表示されます。
正常な手順を踏まずにプロセス落とした場合、消えなかったりしますが…
yuzも画面(Activity)を持たないため、落とされ難いよう同じ設定を行っています。

上記のContentObserverやAlarmManagerによる定期的な処理は
登録したプロセスが殺された場合、通知が受け取れないため、
プロセスが落ちないようにする必要があるのは
システムとして問題があるとは思うのですが、現状ではそうするしかないです。
通知を受け取る必要が出てきた時に
プロセスを起動してくれればいいと思うのですが…
BroadcastReceiverもプロセスが死んでいると受け取れないものがありますし

後、AlarmManagerで定期的に処理を行う場合、
スリープに入らないようWakelockをかける必要な無いです。
バッテリーの消費量にもかかわってくるので、Wakelockをかけるのではなく、
AlarmManager登録時にWAKEUPのついたフラグを指定すればOKなはずです。

0 件のコメント:

コメントを投稿