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