Android 11 デベロッパー プレビュー 2 が公開されました。ぜひお試しのうえ、フィードバックをお寄せください

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

IntentService クラスは、1 つのバックグラウンド スレッドで操作を実行するためのシンプルな構造を提供します。このクラスによって、ユーザー インターフェースの応答性に影響を与えずに、実行に時間のかかる操作を処理できます。また、IntentService に影響を及ぼすユーザー インターフェース ライフサイクル イベントは多くないため、このクラスは、AsyncTask がシャットダウンするような状況でも継続的に実行されます。

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

  • ユーザー インターフェースと直接やり取りすることはできません。結果を UI に配置するには、それを Activity に送信する必要があります。
  • 作業リクエストは順次実行されます。IntentService で実行されている操作を別のリクエストに送信すると、そのリクエストは、最初の操作が完了するのを待ちます。
  • IntentService で実行されている操作は中断できません。

それでも、単純なバックグラウンド操作を実行するときには、ほとんどの場合において 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 に送信する手順については、バックグラウンド サービスに作業リクエストを送信するをご覧ください。