バックグラウンド処理
アクティビティから独立したサービスによってメインスレッド上で実行される、ユーザから直接認識されず、ユーザによって操作を受けない処理。
サービス
アクティビティから独立してバックグラウンド処理を実行する仕組み(=コンポーネント)。
サービスのライフサイクル
サービスのライフサイクルは以下の通り。
アクティビティのstartService()メソッドによってサービスの初期化が行われ、自動的にActive状態へと移行する。
また、アクティビティまたはサービス自身によるサービスの終了時にInactive状態へと遷移する。
なお、Serviceクラスを継承するサービスクラスでは、以下のメソッドと抽象メソッドであるonBind()メソッドをオーバーライドする際に、親(=super)であるServiceクラスのメソッドを呼び出す必要がない。
| ライフサイクル | メソッド | 呼び出しタイミング |
|---|---|---|
Initialized |
onCreate() |
サービスの起動= アクティビティのstartService()
|
Active |
onStartCommand() |
サービスの開始 |
Inactive |
onDestroy() |
サービスの終了= アクティビティのstopService()または サービスクラスのstopSelf()
|
バックグラウンド処理の実装
バックグラウンド処理を実装する手順は、以下の通り。
Serviceクラスを継承するサービスクラスの作成マニフェストファイル(=AndroidManifest.xml)に、1.で作成したサービスを登録サービスクラスにバックグラウンド処理を記述アクティビティからサービスを起動アクティビティまたはサービスクラス内部からサービスを終了
サービスクラスの作成
Serviceクラスを継承するサービスクラスは、プロジェクトにServiceファイルを新規作成して記述する。
サンプルコード
class SoundManageService : Service() {
// Serviceクラスの抽象メソッドの実装(必須)
// -> サービスをバインドして実行する場合はブロック内{...}に処理を記述
override fun onBind(intent: Intent): IBinder {}
// サービスの初期化時に実行する処理
override fun onCreate() {
...
}
// サービスの実行開始時に行う処理
// -> サービスの強制終了時の処理を表すServiceクラス定数を返却
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
...
return <Serviceクラス定数>
}
// サービスの終了時に実行する処理
override fun onDestroy() {
...
}
}
マニフェストファイルへのサービスの登録
マニフェストファイル(=AndroidManifest.xml)に、serviceタグを記述してサービスを登録する。
※Android StudioではServiceファイルの生成と同時に自動的に追記される
serviceタグの属性
| 属性名 | ウィザード入力欄 | 内容 |
|---|---|---|
android:name |
Class Name | サービスクラス名 |
android:enabled |
Exported | 利用可否true: 利用可能false: 利用不可 |
android:exported |
Enabled | 外部アプリからの利用可否true: 外部から利用可能false: 内部のみ利用可能 |
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
...
<application ...>
<service
android:name=".SoundManageService"
android:enabled="true"
android:exported="false">
</service>
...
</application>
</manifest>
バックグラウンド処理の記述
実行するバックグラウンド処理は、サービスの開始時に呼び出されるonStartCommand()のブロック{...}内に記述する。
また、onStartCommand()メソッドは、返り値として「サービスが強制終了した場合のサービスのリカバリ方法」を表すServiceクラス定数が必要となる。
Serviceクラス定数
| 定数 | 内容 |
|---|---|
START_NOT_STICKY |
自動で再起動しない ※常駐必須のサービスでない場合に推奨 |
START_STICKY |
自動で再起動するインテントはnull
|
START_REDELIVER_INTENT |
自動で再起動するインテントは直前に保持していた値 |
サンプルコード
class SoundManageService : Service() {
...
// サービスの実行開始時に行う処理
// -> サービスの強制終了時の処理を表すServiceクラス定数を返却
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
... // バックグラウンド処理を記述
// Serviceクラス定数の返却
return START_NOT_STICKY
}
...
}
アクティビティによるサービスの起動
参考1: インテントとインテントフィルタ
参考2: 研修3日目
アクティビティからサービスを起動する場合、アクティビティとサービスクラスの橋渡し役となるインテント(=Intentオブジェクト)を生成し、インテントを通じてサービスを起動する。
定義
// Intentオブジェクトの生成
Intent(packageContext: Context!, cls: Class<*>!)
// パラメータ
// packageContext: 遷移元のアクティビティオブジェクト(=コンテキスト)
// cls: Javaクラス化した遷移先アクティビティ
// -> KotlinのクラスをJavaに変換する場合は、"<Kotlinクラス名>::class.java"と記述
// インテントを通じたサービスの起動
Context.startService(service: Intent!): ComponentName?
// パラメータ
// service: サービスを保持するIntentオブジェクト
サンプルコード
// Intentオブジェクト
val intent = Intent(this@MainActivity, SoundManageService::class.java)
// サービスの起動
startService(intent)
サービスの終了
サービスを終了する方法は、以下の2通り。
アクティビティ(=サービスクラス外部)のstopService()サービス自身(=サービスクラス内部)のstopSelf()
定義
// アクティビティ(サービスクラス外部)によるサービスの終了
Context.stopService(service: Intent!): Boolean
// パラメータ
// service: サービスを保持するIntentオブジェクト
// サービス自身(サービスクラス内部)によるサービスの終了
Service.stopSelf(): Unit
サンプルコード
// Intentオブジェクト
val intent = Intent(this@MainActivity, SoundManageService::class.java)
// アクティビティによるサービスの終了
stopService(intent)
// サービスクラス自身によるサービスの終了
stopSelf()
