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

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 に送信する手順については、バックグラウンド サービスに作業リクエストを送信するをご覧ください。