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