백그라운드_Service_사용하기 - boostcampwm-2024/and04-Nature-Album GitHub Wiki
Service에 대해 알아보자!
서비스의 유형
1. Foreground
사용자가 알 수 있게 대놓고 처리하는 작업, 다만 앱을 나가도 백그라운드에서 동작 함
- 미디어 플레이어, 음악 플레이어, 위치 추적 등등
2. Background
아무도 모르게 은밀하게 처리하는 작업
- 네트워크 작업, 데이터 동기화 등
3. Bind
컴포넌트가 Service와의 상호작용이 필요할 때 사용
서비스의 LifeCycle
서비스는 앱이 실행되는 동안 앱 프로세스 내에서 작업을 수행한다.
뒤로가기로 앱을 나가도 앱은 종료되지 않고, 백그라운드 상태에서 몇 분 동안 작업이 수행된다.
만약 앱을 완전히 종료하면 서비스 또한 중지되고, 진행 중이던 작업 또한 중단된다.
앱 프로세스 내에서 작업을 수행하기 때문에 별도의 스레드에서 작업하지 않으면 ANR 오류가 발생할 수 있다.
유효 상태의 백그라운드에서 지속적인 작업이 계속 진행되면 시스템에 추가 부하가 발생하여 사용자 환경이 저하될 수 있기 때문에 일정 시간(1~2분)이 지나면 작업 진행 여부와 상관없이 서비스가 중지된다. 따라서 앱을 사용하지 않아도 동작하게 구현하려면 Foreground를 사용해야 한다.
사용 방법
- Manifest 등록
<application
...>
<service android:name=".ServiceClassName"/>
...
</application>
- 서비스 시작과 종료
class MainActivity : AppcompatActivity() {
override fun onCreate(){
val intent = Intent(this, ServiceClassName::class.java)
startService(intent) // 서비스 시작
stopService(intent) // 서비스 종료
}
}
- 서비스
class ServiceClassName: Service(){
override fun onBind(intent: Intent?): IBinder? {
...
}
override fun onCreate() {}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//TODO Service Work
// 아래와 같은 방법으로 스스로 종료도 가능
stopSelf()
stopService(intent)
}
override fun onDestroy() {}
}
추가적으로 알아봐야 할 것
- 작업 예약
- JobScheduler
- JobDispatcher
- JobIntentService