Service

sumi Yoo·2022년 11월 11일
0

Service

백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있으며, 이는 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 계속해서 실행됩니다. 구성 요소를 서비스에 바인딩하여 서비스와 상호작용할 수 있으며, 심지어는 프로세스 간 통신(IPC)도 수행할 수 있습니다.

유형 3가지

  • 포그라운드
    포그라운드 서비스는 사용자에게 보이는 작업을 수행합니다. 포그라운드 서비스는 알림을 표시해야 하고, 사용자가 앱과 상호작용하지 않을 때도 계속 실행됩니다. (ex: 뮤직 플레이어)
  • 백그라운드
    백그라운드 서비스는 사용자에게 보이지 않는 작업을 수행합니다.
  • 바인드
    애플리케이션 구성 요소가 bindService()를 호출하여 해당 서비스에 바인딩되면 서비스가 바인딩됩니다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있습니다.

콜백 메서드

  • onStartCommand()
    구성 요소(예: 액티비티)가 서비스를 시작하도록 요청하는 경우입니다. 이때 startService()를 호출하는 방법을 씁니다. 중단하는 것은 stopSelf() 또는 stopService()를 호출하면 됩니다. 바인딩만 제공하고자 하는 경우, 이 메서드를 구현하지 않아도 됩니다.
  • onBind()
    구성 요소가 해당 서비스에 바인딩되고자 하는 경우에 이 메서드를 호출합니다. 이때 bindService()를 호출하는 방법을 사용합니다. 이 메서드는 항상 구현해야 하지만, 바인딩을 허용하지 않으려면 null을 반환해야 합니다.
  • onCreate()
    시스템은 서비스가 처음 생성되었을 때(즉 서비스가 onStartCommand() 또는 onBind()를 호출하기 전에) 이 메서드를 호출하여 일회성 설정 절차를 수행합니다. 서비스가 이미 실행 중인 경우, 이 메서드는 호출되지 않습니다.
  • onDestroy()
    서비스를 더 이상 사용하지 않고 소멸시킬 때입니다. 각종 리소스를 정리하기 위해 이것을 구현해야 합니다. 이는 서비스가 수신하는 마지막 호출입니다.

시스템이 서비스를 중단하는 경우, 리소스를 다시 사용할 수 있게 되면 가능한 한 빨리 서비스가 다시 시작됩니다. 다만 개발자가 onStartCommand()에서 반환하는 값에 따라 달라집니다.

사용하기

매니페스트에서 서비스 선언

액티비티 및 다른 구성 요소와 마찬가지로, 서비스는 모두 애플리케이션의 매니페스트 파일에서 선언해야 합니다.

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

android:name 특성이 유일한 필수 특성인데, 이는 서비스의 클래스 이름을 나타냅니다.

앱의 보안을 지키기 위해서는 Service를 시작할 때에는 항상 명시적 인텐트만 사용하고 서비스에 대한 인텐트 필터는 선언하지 마세요. 암시적 인텐트를 사용하여 서비스를 시작하면 보안 위험을 초래합니다. 인텐트에 어느 서비스가 응답할 것인지 확신할 수 없고, 사용자는 어느 서비스가 시작되는지 볼 수 없기 때문입니다.
android:exported 특성을 포함하고 이를 false로 설정하면 서비스를 본인의 앱에만 사용 가능하게 할 수 있습니다. 이렇게 하면 다른 앱이 여러분의 서비스를 시작하지 못하도록 효과적으로 방지하며, 이는 명시적 인텐트를 사용하는 경우에도 문제없이 적용됩니다.

started service

다른 구성 요소가 startService()를 호출하고 Intent를 전달하여 시작하고, 그 결과로 서비스의 onStartCommand() 메서드가 호출되는 경우를 말합니다. 서비스는 onStartCommand() 메서드에서 이 Intent를 받습니다. 서비스는 백그라운드에서 무한히 실행될 수 있으며, 이는 해당 서비스를 시작한 구성 요소가 소멸되었더라도 무관합니다.

서비스를 생성하기 위해 확장할 수 있는 클래스가 두 개 있습니다.

  • Service
    모든 서비스의 기본 클래스입니다. 이 클래스를 확장할 때는 서비스가 모든 작업을 완료할 수 있는 새 스레드를 생성하는 것이 중요합니다. 서비스는 기본적으로 애플리케이션의 기본 스레드를 사용하기 때문에 애플리케이션이 실행 중인 액티비티의 성능을 저하시킬 수 있습니다.
  • IntentService(deprecated)
    이것은 Service의 하위 클래스로, worker 스레드를 사용하여 모든 시작 요청을 처리하되 한 번에 하나씩 처리합니다. 요청한 작업이 완료되면 자동적으로 서비스를 중단합니다.

클라이언트가 제공한 작업을 완료하기 위해 onHandleIntent()를 구현합니다.

onStartCommand() 반환값

  • START_NOT_STICKY
    종료되면 다시 시작되지 않는다.
  • START_STICKY
    서비스를 종료하는 경우 서비스를 재생성하고 StartCommand()를 호출하지만 인텐트를 다시 전달하지는 않습니다.
  • START_REDELIVER_INTENT
    서비스를 재생성하고 서비스에 전달된 마지막 인텐트를 가지고 StartCommand()를 호출합니다.

Foreground services

포그라운드 서비스는 사용자가 인식할 수 있는 작업을 수행합니다.

  • 알림에 현재 재생 중인 노래가 표시될 수 있습니다.
  • 사용자의 허가를 받은 후 포그라운드 서비스에서 사용자의 실행을 기록하는 피트니스 앱입니다. 알림은 사용자가 현재 피트니스 세션 동안 이동한 거리를 표시할 수 있다.

사용자가 기본적으로 알림을 해제할 수 있습니다.

스와이프 제스처를 수행합니다.
사용자가 알림을 해제할 수 없도록 하려면 알림을 사용하여 알림을 생성할 때 setOngoing() 메서드에 true를 전달합니다.

포그라운드 서비스 권한 요청

포그라운드 서비스를 사용하는 앱은 다음 코드 스니펫과 같이 FOREGROUND_SERVICE 권한을 요청해야 합니다. 이것은 정상적인 권한이기 때문에 시스템은 자동으로 요청 앱에 권한을 부여한다.

포그라운드 서비스 시작

0개의 댓글