Android アプリケーションは一つ以上の Activity、Service を含みます。Service は UI をもたず、長時間かかる処理をバックグラウンドで行うためのコンポーネントです。基本的な使い方をまとめます。
関連する公式ドキュメント
単純な Service (非同期処理なし)
Android アプリケーションにおいて、既定ではすべてのアプリケーションのスレッドはアプリケーション個別のプロセス内に生成されます。プロセス内のスレッドには、UI を操作する処理を実行する main スレッド (UI スレッド) や、バックグラウンド処理を行うための worker スレッドが存在します。以下の MyService は Service を直接継承しており、MainActivity から startService()
すると、main スレッドで onStartCommand()
の処理が実行されます。そのため、以下のサンプルコードに実用性はなく、一般の用途であれば、worker スレッドを利用する、後述の IntentService を継承した MyIntentService を利用すべきです。
MyService.java
onStartCommand()
で main スレッドを 5 秒間占有してみます。また、onStartCommand()
の返り値で、システムによって MyService が強制終了させられたときの挙動を指定できます。IntentService の場合と同様に、START_STICKY
によって、サービスが Android システムによって kill されたらサービスを再作成して起動するように設定しています。
MainActivity.java
MainActivity の myStartButton/myStopButton を押すとサービスが起動/停止します。それぞれ、MyService をクラス名として設定した Explicit intent を引数にして startService()
および stopService()
を実行しています。
AndroidManifest.xml
Activity の場合と同様に、Service コンポーネントの存在を Android システムに認識させるためには AndroidManifest.xml
を編集する必要があります。
実行例
UI がフリーズするため、警告がログに出力されています。
非同期処理ありの IntentService
MainActivity.java
および AndroidManifest.xml
は、前述「単純な Service (非同期処理なし)」の場合と以下の差分を除いて同じです。Service を直接継承した場合と異なり、start リクエストによって渡されたインテントを main スレッドではなく worker スレッドによってキューから一つずつ取り出して処理するため UI がフリーズすることはありません。
MainActivity.java
AndroidManifest.xml
MyIntentService.java
実行例
サービスの処理完了時に結果を返す
サービスで行う処理のうち、特に結果を返したい場合はブロードキャストや通知を利用します。
ブロードキャスト
前述の「非同期処理ありの IntentService」のサンプルコードをもとに、以下のように変更します。また、ブロードキャストでは受信したとしても Activity がバックグラウンドの場合はフォアグラウンドにはなりません。ユーザーへの完了通知を目的とする場合は後述の「通知」を利用します。
Constants.java
今回のサンプルで必要になる定数を定義します。
MyIntentService.java
onHandleIntent()
内でメッセージをブロードキャストします。
MyReceiver.java
受信時にメッセージをログに出力します。
MainActivity.java
レシーバとフィルタを Android システムに登録します。
実行例
通知
前述の「非同期処理ありの IntentService」のサンプルコードをもとに MyIntentService.java
を以下のように変更します。通知をタップすると MainActivity
が起動します。
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...