長期間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
{
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        // Notificationのインスタンス化
        Notification notification = new Notification();

        Intent i = new Intent(getApplicationContext(), MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, i,
                                                                 PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

        //Foreground Service
        notification = builder.setContentIntent(pi)
                                     .setSmallIcon(R.mipmap.ic_launcher).setTicker(“”)
                                     .setAutoCancel(true).setContentTitle(“タイトル”)
                                     .setContentText(“アプリ名”).build();

        //ステータスバーの通知を消せないようにする
        notification.flags |= Notification.FLAG_ONGOING_EVENT; 
        startForeground(startId, notification); //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




アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム