백그라운드_Service_사용하기 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

Service에 대해 알아보자!

서비스의 유형

1. Foreground

사용자가 알 수 있게 대놓고 처리하는 작업, 다만 앱을 나가도 백그라운드에서 동작 함

  • 미디어 플레이어, 음악 플레이어, 위치 추적 등등

2. Background

아무도 모르게 은밀하게 처리하는 작업

  • 네트워크 작업, 데이터 동기화 등

3. Bind

컴포넌트가 Service와의 상호작용이 필요할 때 사용


서비스의 LifeCycle

image


서비스는 앱이 실행되는 동안 앱 프로세스 내에서 작업을 수행한다.

뒤로가기로 앱을 나가도 앱은 종료되지 않고, 백그라운드 상태에서 몇 분 동안 작업이 수행된다.

만약 앱을 완전히 종료하면 서비스 또한 중지되고, 진행 중이던 작업 또한 중단된다.

앱 프로세스 내에서 작업을 수행하기 때문에 별도의 스레드에서 작업하지 않으면 ANR 오류가 발생할 수 있다.

유효 상태의 백그라운드에서 지속적인 작업이 계속 진행되면 시스템에 추가 부하가 발생하여 사용자 환경이 저하될 수 있기 때문에 일정 시간(1~2분)이 지나면 작업 진행 여부와 상관없이 서비스가 중지된다. 따라서 앱을 사용하지 않아도 동작하게 구현하려면 Foreground를 사용해야 한다.


사용 방법

  1. Manifest 등록
<application
	...>
	<service android:name=".ServiceClassName"/>
	...
</application>
	
  1. 서비스 시작과 종료
class MainActivity : AppcompatActivity() {

	override fun onCreate(){
			val intent = Intent(this, ServiceClassName::class.java)
			startService(intent) // 서비스 시작
			
			stopService(intent) // 서비스 종료
	}
	
}
  1. 서비스
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

파이어베이스 통신 딜레이