서비스(Service)는 Android 애플리케이션에서 백그라운드에서 실행되는 컴포넌트다. 서비스는 사용자 인터페이스가 없으며, 장시간 실행되는 작업을 처리하거나 앱이 백그라운드에서 동작할 수 있도록 한다. 예를 들어, 음악 재생, 파일 다운로드, 네트워크 통신 등과 같은 작업을 처리할 때 서비스가 사용된다.
서비스는 다음과 같은 경우에 사용된다:
서비스 클래스 정의:
서비스는 Service
클래스를 상속받아 정의한다. 이 클래스에서 onCreate()
, onStartCommand()
, onDestroy()
등의 메서드를 구현할 수 있다.
class MyService : Service() {
override fun onCreate() {
super.onCreate()
// 서비스가 생성될 때 호출됩니다.
Log.d("MyService", "Service Created")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 서비스가 시작될 때 호출됩니다.
Log.d("MyService", "Service Started")
// 여기에 백그라운드 작업을 수행합니다.
return START_STICKY // 서비스가 종료되면 다시 시작하도록 설정
}
override fun onDestroy() {
super.onDestroy()
// 서비스가 종료될 때 호출됩니다.
Log.d("MyService", "Service Destroyed")
}
override fun onBind(intent: Intent?): IBinder? {
// 서비스가 바인딩되었을 때 호출됩니다. (바인딩 서비스의 경우)
return null
}
}
서비스 등록:
AndroidManifest.xml
파일에 서비스를 등록한다. 서비스의 name
속성에는 서비스 클래스의 전체 경로를 지정한다.
<service android:name=".MyService"/>
서비스 시작:
서비스를 시작하려면 startService()
메서드를 사용한다. 이 메서드는 서비스가 실행되고, 앱이 백그라운드에 있어도 계속 실행된다.
val intent = Intent(this, MyService::class.java)
startService(intent)
서비스 정지:
서비스를 정지하려면 stopService()
메서드를 사용한다. 이 메서드는 서비스의 onDestroy()
메서드를 호출하여 서비스를 종료한다.
val intent = Intent(this, MyService::class.java)
stopService(intent)
onCreate()
:
onStartCommand()
:
startService()
메서드를 호출하여 서비스를 시작하면 호출된다.START_NOT_STICKY
: 서비스가 종료되면 자동으로 다시 시작하지 않음.START_STICKY
: 서비스가 종료되면 시스템이 서비스의 재시작을 시도함.START_REDELIVER_INTENT
: 서비스가 종료되면 시스템이 인텐트를 다시 전달하고 서비스 재시작을 시도함.onBind()
:
null
을 반환한다. onUnbind()
:
onDestroy()
:
stopService()
메서드가 호출되거나 서비스가 시스템에 의해 종료될 때 이 메서드에서 리소스를 해제하거나 정리 작업을 수행한다.서비스와 클라이언트 간의 통신을 위해 IBinder 객체를 사용한다.
IBinder는 서비스와 클라이언트 간의 메서드 호출 및 데이터 전송을 가능하게 하는 인터페이스다.
서비스에서 IBinder 객체를 반환하면 클라이언트는 이 객체를 통해 서비스를 직접 조작할 수 있다.
ex) 카카오톡에서 메시지 전송과 관련된 기능을 제공하는 서비스와 클라이언트(예: 메시지 작성 화면)가 상호작용해야 하는 경우.
AIDL (Android Interface Definition Language)은 안드로이드에서 프로세스 간 통신(IPC)을 위한 메커니즘이다. AIDL을 사용하면 서로 다른 프로세스에서 실행되는 서비스와 클라이언트 간에 메서드를 호출하고 데이터를 교환할 수 있다.
AIDL 인터페이스 정의: AIDL 파일에서 서비스와 클라이언트가 사용하는 메서드와 데이터 구조를 정의한다. 이 파일은 .aidl 확장자를 가지며, 서비스와 클라이언트 간의 통신 규약을 정의한다.
ex) 카카오톡이 여러 프로세스에서 실행될 때, 예를 들어 메시지 전송 서비스가 별도의 프로세스에서 실행되며, 다른 프로세스에서 메시지를 전송하려는 경우.
백그라운드 제약은 앱이 백그라운드에서 실행될 때, 즉 화면에 보이지 않는 상태에서 앱이 시스템 자원을 너무 많이 사용하지 않도록 하는 규칙이다. 이 규칙은 배터리 소모를 줄이고, 기기 성능을 최적화하기 위해 도입되었다.
브로드캐스트 리시버나 서비스를 사용할 때는 항상 백그라운드 제약을 염두에 두어야 한다.
백그라운드 서비스 제한:
배터리 절약 모드:
앱 대기 모드:
네트워크 접근 제한:
브로드캐스트 제한:
잡 스케줄러는 안드로이드에서 앱이 백그라운드에서 해야 할 작업을 관리하는 도구다. 작업을 정해진 시간이나 조건에 맞춰 자동으로 실행해준다.
작업 예약:
백그라운드 작업 관리:
재시도: