【Kotlin/Android Studio】Serviceとは?種類とバックグラウンド操作
この記事からわかること
- Android Studio/KotlinのServiceの使い方
- サービスの種類と実装方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Serviceとは?
Serviceとはバックグラウンドなどで長時間処理を実装したい場合に使用するUIを実装しないアプリコンポーネントです。
サービスの役割はアプリを操作していない間に処理を行うことです。ユーザーがアプリを操作している間に限り処理をメインスレッド以外で実行したい場合はスレッドを使用することが推奨されています。例えばActivityが実行している間だけ音楽を流す場合は、onCreate()
でスレッドを作成し、onStart()
で実行を開始して、onStop()
で停止するべきだと公式に記述されています。
そうではなくアプリが起動している間音楽を流したい場合はActivityでは破棄されるたびに音楽が止まってしまうのでバックグラウンドで処理を実行できるサービスを使用します。
サービスの種類
サービスには3種類あります。
フォアグラウンド サービス
ユーザーが認識できる操作を行うサービス。例えば音楽を再生するなど。ユーザーがアプリを操作していない間も動作する。
バックグラウンド サービス
ユーザーには直接認識できない操作を行うサービス。API操作やファイルの読み込みや書き込みなど内部的な操作を行いたい場合に使用する。
バインドされたサービス
他のコンポーネント(Activityなど)からbindServiceメソッドを使用してバインドされた状態のサービス。コンポーネントからサービスを操作することができる。サービスは複数のコンポーネントからバインドすることができ、全てアンバインドされるとサービスが破棄される。
サービスを実装するにあたって
サービスを実装するためにはService
を継承したサブクラスを定義します。サービスもライフサイクルを保持しているのでオーバーライドして処理を実装して行きます。onStartCommand
メソッドは返り値としてサービスが突然Killされた場合の挙動を返します。
class ExampleService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("Service:", "onStartCommand")
intent?.getStringExtra("msg")?.let {
Log.d("Intent:", it)
}
// 返り値にサービスが突然Killされた場合の動作を返す
return START_NOT_STICKY // サービスの再起動なし
}
override fun onCreate() {
super.onCreate()
Log.d("Service:", "onCreate")
}
override fun onDestroy() {
super.onDestroy()
Log.d("Service:", "onDestroy")
}
override fun onBind(intent: Intent): IBinder {
Log.d("Service:", "onBind")
}
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
Log.d("Service:", "onTaskRemoved")
}
}
マニフェストファイルへ追記
プロジェクト内にサービスを追加した場合はマニフェストファイルへサービスを明記する必要があります。
<manifest ...>
...
<application ...>
<service
android:name=".ExampleService"
android:enabled="true"
android:exported="false" />
</application>
</manifest>
Activityから呼び出し
Activityからサービスを呼び出す際はstartService
メソッドを使用します。引数にIntent
を渡すことで値を渡すことも可能です。実行されたサービスを停止するためにはstopService
メソッドを使用します。
おすすめ記事:【Kotlin/Android Studio】Intentとは?Activity間のデータの受け渡し
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val buttonStart: Button = findViewById(R.id.button)
val buttonStop: Button = findViewById(R.id.button2)
buttonStart.setOnClickListener {
val intent = Intent(this, ExampleService::class.java)
intent.putExtra("msg", "Hello World!!")
startService(intent)
buttonStart.isEnabled = false
buttonStop.isEnabled = true
}
buttonStop.setOnClickListener {
val intent = Intent(this, ExampleService::class.java)
stopService(intent)
buttonStart.isEnabled = true
buttonStop.isEnabled = false
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。