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

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