バックグラウンド処理
アクティビティ
から独立したサービス
によってメインスレッド
上で実行される、ユーザから直接認識されず、ユーザによって操作を受けない処理。
サービス
アクティビティ
から独立してバックグラウンド処理
を実行する仕組み(=コンポーネント
)。
サービスのライフサイクル
サービス
のライフサイクルは以下の通り。
アクティビティ
の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()