AndroidのService#OnStartCommand()の返り値

目次

Android のサービスは、起動する時に呼ばれるメソッド OnStartCommand の返り値によって強制終了された時の振る舞いが変わります。

START_STICKY
強制終了されても自動的にサービスが再起動されます。再起動時には OnStartIntent に渡される intent が null の可能性があります。
START_NOT_STICY
強制終了されても再起動はされない。
START_REDELIVER_INTENT
強制終了されても自動的にサービスが再起動されます。この時 START_STICKY とは異なり最初に起動された時の intent が再起動する時にも渡されます。

START_STICKY or START_REDELIVER_INTENT

サービスが強制終了された時に自動的に再起動するための返り値が二種類あるけど、intent の有無の他に違いはないのでしょうか?

そこで簡単に実験してみたところ、START_STICKY と START_REDELIVER_INTENT ではサービスが再起動されるまでの時間が異なるようです。具体的には、START_STICKY は強制終了してもすぐに再起動されますが、START_REDELIVER_INTENT は再起動されるまでに分単位で時間がかかりました。

返り値 再起動までの時間
START_STICKY すぐに再起動
START_REDELIVER_INTENT 再起動まで 1 分くらい

サービスが強制終了させられてもすぐに同じ intent でサービスを開始したい場合は、intent の内容を SharedPreference やデータベースに書いておき、START_STICKY を指定してサービスを起動するのが良さそうです。そして intent が null でサービスが起動されたら保存しておいた intent 内容を読んで再開するという方法を取ります。

参照

Service – Developers