관리 메뉴

나만을 위한 블로그

[Android] 서비스란? 본문

Android

[Android] 서비스란?

참깨빵위에참깨빵 2021. 10. 1. 00:04
728x90
반응형

서비스는 안드로이드 4대 컴포넌트 중 하나로, 백그라운드에서 어떤 작업을 수행해야 할 때 사용을 고려할 수 있는 컴포넌트다. 그러나 백그라운드에서 수행되는 작업이라고 다 서비스를 사용하는 건 아니다.

안드로이드 디벨로퍼에서 말하는 서비스는 아래와 같다.

 

https://developer.android.com/guide/components/services?hl=ko 

 

서비스 개요  |  Android 개발자  |  Android Developers

서비스 개요 Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 애플리케이션 구성 요소가 서비스를 시

developer.android.com

서비스는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 앱 컴포넌트며 UI를 제공하지 않는다. 다른 앱 컴포넌트가 서비스를 시작할 수 있으며, 이는 사용자가 다른 앱으로 전환하더라도 백그라운드에서 계속 실행된다. 이외에도 컴포넌트를 서비스에 바인딩해 서비스와 상호작용할 수 있으며, 프로세스 간 통신(IPC)도 수행할 수 있다. 서비스는 3가지 유형이 있다.

1. 포그라운드 : 포그라운드 서비스는 사용자에게 잘 보이는 몇몇 작업을 수행한다. 오디오 앱이라면 오디오 트랙 재생 시 포그라운드 서비스를 사용한다. 포그라운드 서비스는 알림을 표시해야 하며, 사용자가 앱과 상호작용하지 않을 때도 계속 실행된다.

2. 백그라운드 : 백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행한다. 어느 앱이 저장소를 압축하는 데 서비스를 사용했다면 이것은 대개 백그라운드 서비스다. 참고로 앱이 API 레벨 26 이상을 대상으로 한다면 앱이 포그라운드에 없을 때 시스템에서 백그라운드 서비스 실행에 대한 제한을 적용한다. 이런 경우는 대부분 앱이 예약된 작업을 사용해야 한다.

3. 바인드 : 앱 구성 요소가 bindService()를 호출해 해당 서비스에 바인드되면 서비스가 바인딩된다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공해 컴포넌트가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 이런 작업을 여러 프로세스에 걸쳐 프로세스 간 통신으로 수행할 수도 있다. 바인딩된 서비스는 또 다른 앱 컴포넌트가 이것에 바인딩돼 있는 경우에만 실행된다. 여러 컴포넌트가 서비스에 한꺼번에 바인딩될 수 있지만 이 모든 것에서 바인딩이 해제되면 해당 서비스는 소멸한다.

 

서비스도 결국 컴포넌트기 때문에 안드로이드 시스템이 관리할 것이고, 만들어 사용하려면 반드시 매니페스트에 등록해야 쓸 수 있다.

서비스는 3가지 종류가 있다고 한다. 각 서비스의 종류를 찾아서 확인해봤다.

 

https://keykat7.blogspot.com/2021/01/android-notification-foreground-service.html

 

[Android] 포그라운드, 백그라운드, 서비스의 개념과 Notification을 이용한 포그라운드 서비스 (Foregrou

알고리즘, 코딩 테스트, C++, java, 파이썬, AI, 백준, 기업 코딩 테스트, 자료구조, 프로젝트, codeforces, unity, android

keykat7.blogspot.com

백그라운드 서비스, 포그라운드 서비스의 차이는 화면에 보여지냐의 차이다. 모바일 게임을 하다 홈 화면으로 이동한 후 몇 초 뒤 다시 게임으로 돌아오면 게임이 계속 진행된다. 오래 벗어나 있으면 안드로이드가 자원을 많이 사용하는 백그라운드 작업이라 판단해 강제종료할 수 있지만 잠깐 나갔다 오면 유지되는 걸 볼 수 있다. 즉, 화면에 보이지 않지만 앱이 계속 실행 중인 상태를 백그라운드 프로세스라고 볼 수 있으며, 이는 안드로이드가 시스템 자원이 부족하다고 판단하면 강제종료할 수 있다. 반대로 앱이 어떤 작업을 하고 있는지 눈으로 직접 확인할 수 있는 걸 포그라운드 프로세스라고 볼 수 있으며 유튜브를 보거나 웹서핑하는 등을 포그라운드 프로세스라고 볼 수 있다.

즉, 앱이 어떤 작업을 하고 있는 걸 눈으로 보고 터치하는 등 상호작용을 할 수 있다면 포그라운드 서비스, 어떤 작업을 하고는 있지만 사용자가 직관적으로 확인할 수 엇다면 백그라운드 서비스라고 보면 되겠다. 알림 창에서 앱이 뭔가를 다운로드하거나 "앱이 실행 중" 이란 창을 본 적이 있다면 포그라운드 서비스, 게임 업데이트 중 게임 앱을 꺼도 업데이트가 계속 되는 것은 백그라운드 서비스라고 보면 된다.

포그라운드, 백그라운드 서비스는 앱에서 서비스를 "시작"하는 것이다. 실제로 startService()를 써서 사용하며 "내(앱)가 종료되든 백그라운드 프로세스 상태가 되든 너가 맡은 작업은 계속 해라" 라는 뜻이다. 즉 서비스를 한 번 시작하면 작업이 완료되거나 불가피하게 종료되는 게 아니면 종료되더라도 작업은 계속한다.

바인드 서비스는 앱에서 어떤 서비스를 바인드하면 "내(앱)가 종료되기 전까지 너(서비스)는 나와 계속 통신해야 한다"는 의미가 된다. 서버와 클라이언트가 통신하는 것처럼 작동하는데, 앱이 해당 서비스를 바인드한 액티비티들(여러 액티비티가 한 서비스에 바인드할 수 있다)이 전부 종료되기 전까진 서비스가 유지되며, 액티비티들이 모두 종료되면 서비스도 종료된다.

 

https://gyubgyub.tistory.com/73

 

[ Android ] Foreground Service 와 BackGround Service

안드로이드 개발을 하다보면 백그라운드 실행이 필요한 작업을 수행해야될 때가 있는데요. 이럴 때 메인 스레드가 아닌 서브 스레드를 생성하여 사용하게 됩니다. 하지만 서브 스레드로만 작업

gyubgyub.tistory.com

백그라운드 서비스 : 사용자에게 직접적으로 안 보이는 작업 수행 / 게시물을 SNS에 공유한 후 다른 화면에서 다른 사람들의 게시물들을 본다. 이 때 내 게시물을 공유하고 다른 화면으로 넘어가거나 앱을 종료해도 게시물 업로드는 종료되지 않고 백그라운드 서비스가 시작되어, 업로드는 진행중이나 사용자는 이걸 눈으로 보진 못한다.

포그라운드 서비스 : 사용자에게 잘 보이는 몇몇 작업 수행 / 멜론, 플레이 스토어 같은 앱은 노래 재생 시 포그라운드 서비스를 시작한다. 사용자는 상태바의 알림창을 통해 노래의 일시정지, 재생 등의 동작을 수행할 수 있고 다운로드가 얼마나 됐는지 알 수 있다. 이처럼 포그라운드 서비스는 알림을 꼭 표시해야 한다. 포그라운드 서비스가 실행되고 5초 안에 알림을 표시하지 않으면 ANR이 발생하며, 사용자가 앱과 상호작용하지 않을 때도 계속 실행된다. 또한 메모리가 부족하더라도 시스템에 의해 강제종료되지 않는다.

 

각각의 서비스를 정리하면 각각 아래와 같다.

 

  • 포그라운드 서비스
    • 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식으로 처리되는 서비스
    • 유저가 현재 뭘 하고 있다는 걸 인지하고 있는 서비스다
    • 그래서 메모리 부족 시 안드로이드 시스템에 의한 강제종료 대상에서 제외된다
    • 대신 포그라운드 서비스가 실행되는 도중엔 무조건 상태바에 알림이 제공돼야 한다.
    • 앱과 사용자가 상호작용하지 않아도 계속 실행된다
    • 포그라운드 프로세스 : 화면에서 앱이 어던 작업을 하는지 눈으로 볼 수 있는 프로세스(유튜브 시청, 웹 서핑)
  • 백그라운드 서비스
    • 사용자에게 안 보이는 작업을 수행한다
    • 인스타에서 게시물 공유 버튼을 눌러 인스타에 사진을 업로드하는 동안 카톡하거나 인스타를 꺼도 게시물 업로드는 종료되지 않는다. 이 때 백그라운드 서비스가 사용됨
  • 바인드 서비스
    • 클라이언트-서버 구조처럼 컴포넌트가 서비스에 연결되면 서비스가 서버 역할을 한다
    • 컴포넌트가 서비스에게 요청하면 서비스는 그것에 맞는 결과값을 리턴한다
    • 클라이언트가 연결을 해제하고 서비스와 연결된 클라이언트가 없을 때 바인드 서비스가 종료된다
반응형
Comments