서비스 컴포넌트

이윤설·2024년 9월 2일
0

1. 서비스 이해하기

서비스(Service)는 Android 애플리케이션에서 백그라운드에서 실행되는 컴포넌트다. 서비스는 사용자 인터페이스가 없으며, 장시간 실행되는 작업을 처리하거나 앱이 백그라운드에서 동작할 수 있도록 한다. 예를 들어, 음악 재생, 파일 다운로드, 네트워크 통신 등과 같은 작업을 처리할 때 서비스가 사용된다.

서비스는 다음과 같은 경우에 사용된다:

  • 사용자가 앱의 UI와 상관없이 계속 실행해야 하는 작업이 있을 때.
  • 앱이 백그라운드에서 장기적인 작업을 실행해야 할 때.
  • 다른 앱의 컴포넌트와 상호작용할 때.

서비스 생성과 실행

  1. 서비스 클래스 정의:
    서비스는 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
        }
    }
  2. 서비스 등록:
    AndroidManifest.xml 파일에 서비스를 등록한다. 서비스의 name 속성에는 서비스 클래스의 전체 경로를 지정한다.

    <service android:name=".MyService"/>
  3. 서비스 시작:
    서비스를 시작하려면 startService() 메서드를 사용한다. 이 메서드는 서비스가 실행되고, 앱이 백그라운드에 있어도 계속 실행된다.

    val intent = Intent(this, MyService::class.java)
    startService(intent)
  4. 서비스 정지:
    서비스를 정지하려면 stopService() 메서드를 사용한다. 이 메서드는 서비스의 onDestroy() 메서드를 호출하여 서비스를 종료한다.

    val intent = Intent(this, MyService::class.java)
    stopService(intent)

2. 서비스 생명주기

  1. onCreate():

    • 서비스가 처음 생성될 때 호출된다. 서비스가 생성되면 이 메서드가 호출되어 초기화 작업을 수행할 수 있다.
  2. onStartCommand():

    • startService() 메서드를 호출하여 서비스를 시작하면 호출된다.
      서비스가 백그라운드 작업을 수행할 때 이 메서드에서 처리할 작업을 구현한다.
      반환값에 따라 서비스의 종료 정책을 결정할 수 있다.
      - START_NOT_STICKY: 서비스가 종료되면 자동으로 다시 시작하지 않음.
      - START_STICKY: 서비스가 종료되면 시스템이 서비스의 재시작을 시도함.
      - START_REDELIVER_INTENT: 서비스가 종료되면 시스템이 인텐트를 다시 전달하고 서비스 재시작을 시도함.
  3. onBind():

    • 서비스가 바인딩될 때 호출된다. 바인딩 서비스의 경우, 클라이언트와 서비스 간의 인터페이스를 정의하여 데이터를 주고받을 수 있다. 바인딩이 필요 없는 경우 null을 반환한다.
  4. onUnbind():

    • 서비스가 바인딩된 클라이언트와의 연결이 끊어질 때 호출된다. 바인딩 서비스의 경우 연결이 끊어진 후 정리 작업을 수행할 수 있다.
  5. onDestroy():

    • 서비스가 종료될 때 호출된다. stopService() 메서드가 호출되거나 서비스가 시스템에 의해 종료될 때 이 메서드에서 리소스를 해제하거나 정리 작업을 수행한다.

IBinder 객체 바인딩

서비스와 클라이언트 간의 통신을 위해 IBinder 객체를 사용한다.
IBinder는 서비스와 클라이언트 간의 메서드 호출 및 데이터 전송을 가능하게 하는 인터페이스다.

서비스에서 IBinder 객체를 반환하면 클라이언트는 이 객체를 통해 서비스를 직접 조작할 수 있다.

ex) 카카오톡에서 메시지 전송과 관련된 기능을 제공하는 서비스와 클라이언트(예: 메시지 작성 화면)가 상호작용해야 하는 경우.

AIDL 통신 기법

AIDL (Android Interface Definition Language)은 안드로이드에서 프로세스 간 통신(IPC)을 위한 메커니즘이다. AIDL을 사용하면 서로 다른 프로세스에서 실행되는 서비스와 클라이언트 간에 메서드를 호출하고 데이터를 교환할 수 있다.

AIDL 인터페이스 정의: AIDL 파일에서 서비스와 클라이언트가 사용하는 메서드와 데이터 구조를 정의한다. 이 파일은 .aidl 확장자를 가지며, 서비스와 클라이언트 간의 통신 규약을 정의한다.

ex) 카카오톡이 여러 프로세스에서 실행될 때, 예를 들어 메시지 전송 서비스가 별도의 프로세스에서 실행되며, 다른 프로세스에서 메시지를 전송하려는 경우.


3. 백그라운드 제약 (Background Execution Limits)

백그라운드 제약은 앱이 백그라운드에서 실행될 때, 즉 화면에 보이지 않는 상태에서 앱이 시스템 자원을 너무 많이 사용하지 않도록 하는 규칙이다. 이 규칙은 배터리 소모를 줄이고, 기기 성능을 최적화하기 위해 도입되었다.

브로드캐스트 리시버나 서비스를 사용할 때는 항상 백그라운드 제약을 염두에 두어야 한다.

  1. 백그라운드 서비스 제한:

    • 앱이 화면에 보이지 않을 때, 즉 백그라운드에서 동작하는 서비스는 제한된다. 예를 들어, 음악을 재생하는 앱이 화면에 보이지 않더라도 음악이 계속 재생될 수 있어야 하지만, 메시지 전송 같은 작업은 백그라운드에서 오랫동안 실행될 수 없다.
  2. 배터리 절약 모드:

    • Doze 모드: 휴대폰을 오랫동안 사용하지 않으면 자동으로 절전 모드에 들어간다. 이 모드에서는 앱이 자주 업데이트를 받거나 네트워크를 사용할 수 없다. 이렇게 해서 배터리를 아끼는 것이다.
  3. 앱 대기 모드:

    • 앱이 오랫동안 사용되지 않으면 시스템이 이 앱의 작업을 제한한다. 예를 들어, 사용하지 않는 앱이 계속해서 위치 정보를 업데이트하지 못하게 된다.
  4. 네트워크 접근 제한:

    • 백그라운드에서 앱이 네트워크를 사용할 수 있는 시간이 제한된다. 즉, 앱이 화면에 보이지 않더라도 자주 인터넷에 연결되지 않도록 제한된다.
  5. 브로드캐스트 제한:

    • 앱이 백그라운드에서 시스템의 알림을 받는 것이 제한된다. 예를 들어, 앱이 화면에 보이지 않을 때 특정 시스템 알림을 받는 것이 제한된다.

4. 잡 스케줄러 (JobScheduler)

잡 스케줄러는 안드로이드에서 앱이 백그라운드에서 해야 할 작업을 관리하는 도구다. 작업을 정해진 시간이나 조건에 맞춰 자동으로 실행해준다.

잡 스케줄러의 주요 기능

  1. 작업 예약:

    • 조건 설정: 작업이 실행될 조건을 설정할 수 있다. 예를 들어, Wi-Fi에 연결되었을 때만 데이터를 다운로드하거나, 기기가 충전 중일 때만 작업을 수행하도록 설정할 수 있다.
  2. 백그라운드 작업 관리:

    • 스케줄링: 작업을 예약하고, 정해진 시간이나 조건에 따라 작업을 실행한다. 예를 들어, 매일 밤 정해진 시간에 데이터 백업 작업을 실행하도록 예약할 수 있다.
  3. 재시도:

    • 자동 재시도: 작업이 실패하면 시스템이 자동으로 다시 시도하게 설정할 수 있다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글