バックグラウンド サービスを作成する

IntentService クラスは、単一のバックグラウンド スレッド上で処理を実行するためのシンプルな構造を提供します。これにより、ユーザー インターフェースの応答性に影響を与えることなく、長時間実行オペレーションを処理できます。また、IntentService に影響を及ぼすユーザー インターフェース ライフサイクル イベントはほとんどないため、このクラスは、AsyncTask がシャットダウンするような状況でも引き続き実行されます。

IntentService には制限がいくつかあります。

  • ユーザー インターフェースと直接インタラクションすることはできません。結果を UI に表示するには、Activity に送信する必要があります。
  • 作業リクエストは順次実行されます。IntentService で実行されているオペレーションに別のリクエストを送信すると、そのリクエストは最初のオペレーションが完了するまで待機します。
  • IntentService で実行されているオペレーションは中断できません。

ただし、単純なバックグラウンド処理を実行するには、ほとんどの場合、IntentService の使用をおすすめします。

このガイドでは、次の処理を行う方法について説明します。

  • IntentService の独自のサブクラスを作成します。
  • 必要なコールバック メソッド onHandleIntent() を作成します。
  • マニフェスト ファイルで IntentService を定義します。

受信インテントを処理する

アプリの IntentService コンポーネントを作成するには、IntentService を拡張するクラスを定義し、その中に onHandleIntent() をオーバーライドするメソッドを定義します。次に例を示します。

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Java

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

標準 Service コンポーネントの他のコールバック(onStartCommand() など)が、IntentService によって自動的に呼び出されています。IntentService 内では、これらのコールバックをオーバーライドしないでください。

IntentService の作成について詳しくは、IntentService クラスを拡張するをご覧ください。

マニフェスト内でインテント サービスを定義する

IntentService は、アプリ マニフェストにもエントリが必要です。このエントリは、 <application> 要素の子である <service> 要素として指定します。

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

属性 android:name は、IntentService のクラス名を指定します。

なお、<service> 要素にはインテント フィルタが含まれていません。サービスに作業リクエストを送信する Activity は、明示的 Intent を使用するため、フィルタは不要です。これは、同じアプリまたは同じユーザー ID を持つ他のアプリのコンポーネントのみが、サービスにアクセスできることも意味します。

これで、基本的な IntentService クラスを用意できたので、Intent オブジェクトを使用してこのクラスに作業リクエストを送信することができます。これらのオブジェクトを作成して IntentService に送信する手順については、作業リクエストをバックグラウンド サービスに送信するをご覧ください。