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