서비스 개요
서비스는 백그라운드에서 꺼지지 않고 작업을 수행하는 안드로이드 4대 구성요소 중 하나. 서비스는 독립된 구성요소이기 때문에 독립된 생명 주기를 가진다. 액티비티가 소멸되더라도 서비스는 독립된 상태로 실행이 되고 있어서 다시 액티비티를 생성하여 해당 서비스와 소통할 수도 있다.
서비스 유형은 세가지로 나눌 수 있다
- 백그라운드
- 포그라운드 : 예를 들면 뮤집 앱에서 음악을 재생할 때와 같이 상태 표시줄에 알림이 표시되며 유저가 서비스가 실행되고 있음을 인지할 수 있는 서비스.
- 바인드
실제 사용방법
1. 포그라운드 퍼미션 요청하기
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application ...>
...
</application>
</manifest>
Android 9 이상을 대상으로 하는 앱에 대해 포그라운 서비스 권한을 등록해줘야한다. (백그라운드 서비스를 사용하고 유저가 해당 사실을 모르면 기기에 성능 저하가 나타나기 때문)
startForegroundService() 함수와 startService()의 다른 점 : startForegroundService() 함수 호출 뒤 5초 이내에 startForeground() 함수를 통해 알림을 보여주어야 함.
2. Service 정의 + Manifest에 정의하기
class MusicPlayerService : Service() {
var mediaPlayer: MediaPlayer? = null
var binder :MusicPlayerBinder = MusicPlayerBinder()
inner class MusicPlayerBinder : Binder() {
fun getService(): MusicPlayerService {
return this@MusicPlayerService
}
}
override fun onCreate() {
super.onCreate()
startForegroundService()
}
override fun onBind(intent: Intent): IBinder {
return binder
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
}
fun startForegroundService(){}
fun isPlaying(){}
fun play(){}
fun stop(){}
}
- onCreate() : 서비스가 생성될 때 딱 한 번만 실행되는 함수. 여기서 알림을 생성하는 startForegroundService()를 실행
- onBind() : 액티비티와 같은 구성요소에서 bindService() 함수를 호출할 때 실행되는 함수. 서비스와 구성요소를 이어주는 IBinder를 반환함. 바인드가 필요없는 서비스면 null을 반환하면 된다.
- onStartCommand() : startService()를 호출하면 실행되는 콜백 함수. 반드시 정숫값을 반환해야 한다.
- START_STICKY : 시스템이 호출을 중단하면 서비스를 다시 실행하고 onStartCommand() 함수를 호출한다.
- START_NOT_STICKY : 시스템이 호출을 중단하면 서비스를 재생성하지 않는다
- START_REDELIVER_INTENT : 시스템이 호출을 중단하면 서비스를 다시 실행하고 onStartCommand() 함수를 호출한다. 서비스 종료 전 마지막으로 전달된 인텐트를 재전달한다. -> 반드시 명령을 실행해야 하는 경우에 쓰임.
<application>
...
<service android:name=".MusicPlayerService" />
</application>
3. 알림 채널, 알림 서비스 종료 기능 구현
fun startForegroundService() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel("ID", "NAME", NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
val notification = Notification.Builder(this, "ID")
.setContentTitle("뮤직 플레이어 앱")
.setContentText("앱이 실행중입니다.")
.build()
startForeground(1, notification)
}
알림을 만든 후 startForeground(1, notification)으로 서비스를 포그라운드 서비스로 만든다. 첫 번째 인수로는 0이 아닌 정숫값을 넘겨 알림의 식별자로 사용한다.
override fun onDestroy() {
super.onDestroy()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
stopForeground(true)
}
}
서비스가 중단될 때 stopForeground(true)함수를 사용하여 포그라운드 서비스를 멈춘다.
4. Activity 또는 Fragment에서 서비스 실행해주기
Intent(applicationContext, MusicPlayerService::class.java).run {
startForegroundService(this)
}
종료
Intent(applicationContext, MusicPlayerService::class.java).run {
stopService(this)
}
https://developer.android.com/guide/components/services?hl=ko
'Android' 카테고리의 다른 글
Android filesDir.path 폴더 안에 하위 목록까지 삭제하기 (0) | 2022.09.27 |
---|---|
Kotlin for문 (0) | 2022.08.18 |
Fatal Exception: android.content.ActivityNotFoundException 예외처리 (0) | 2022.06.28 |
Android Retrofit2을 이용한 로그인 example (0) | 2022.06.16 |
TextView 특정 글자만 색상/크기 변경하기 (0) | 2022.05.31 |
댓글