長期間Serviceを起動したい時
こんにちはTamamoです。
比較的長い期間Serviceを起動したときがあると思います。
しかし、Androidはメモリ不足などで自動的にServiceをkillする場合があり、
また、アプリ起動履歴からスワイプして消した場合、プロセスまでkillされてしまい、
長期間Serviceを起動させ続けたい場合困る場合があります。
そこで、絶対にkillされない鉄壁のServiceは作れませんが、killされにくいServiceを
作る方法があるので紹介します。
Foreground Serviceを使用する
Foreground Serviceは通常のBackground Serviceと違い、フォアグラウンドのActivity
と同様の優先度となり、killされにくくなります。
また、Foreground Serviceはメモリ不足になっても基本的にkillされることはなく、
意図しないServiceの再起動を誘発することはありません。
しかし、絶対にkillされないわけではないので注意が必要です。
Foreground Serviceの使い方
以下のソースコードでForeground Serviceを実行できます。
public class MonitorLaunchService extends Service Intent i = new Intent(getApplicationContext(), MainActivity.class); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); //Foreground Service //ステータスバーの通知を消せないようにする return START_STICKY; //① |
onStartCommandの戻り値について
上記のソースコードの①の部分はServiceがkillされたとき再起動するかしないかなどを設定します。
いくつかの種類がありますので紹介します。
●START_NOT_STICKY
Serviceがkillされた場合、Serviceは再起動しません。
●START_STICKY
デフォルトではこの設定になります。
Serviceがkillされた場合、直ちにServiceの再起動を行います。
再起動時、前回起動時のIntentは再配信されず、
複数のServiceが起動していても再起動するServiceは1つです。
●START_REDELIVER_INTENT
Serviceがkillされた場合、直ちにServiceの再起動を行います。
再起動時、最後に使用したIntentを使用します。
また、複数のServiceが起動している場合、すべて再起動します。
●START_STICKY_COMPATIBLILITY
START_STICKYの互換バージョンです。Android2.0未満ではこれがデフォルト設定です。
最後に
Serviceを使用したアプリを作る必要があったため、
最初に使用したのはBackground Serviceでした。
これが厄介で、メモリ不足でkillされたり、アプリ起動履歴からスワイプして消した場合、
プロセスまでkillされたりで、結構ハマりました。
目的に合わせてServiceは使い分けないといけないんですね。勉強になります。
火曜日担当:Tamamo
admin at 2018年02月27日 10:00:39