Nuke Olaf - Log Store

[Android] 안드로이드 - 서비스란? 본문

Android

[Android] 안드로이드 - 서비스란?

NukeOlaf 2019. 12. 1. 17:52

Service 란 백그라운드에서 오래 실행되는 작업을 수행하는 안드로이드 앱의 컴포넌트이다.

1. Service 의 사전적 의미 찾기

https://dictionary.cambridge.org/dictionary/english/service

work that someone does or time that someone spends working for an organization

누군가가하는 일이나 누군가가 조직을 위해 일하는 시간

 

2. Service 의 IT 사전적 의미 찾기

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

https://www.javatpoint.com/android-service-tutorial

< 안드로이드 디벨롭퍼 사이트에서 말하는 Service >

A Service is an application component that can perform long-running operations in the background, and it doesn't provide a user interface. Another application component can start a service, and it continues to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service can handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

 

Service  |  Android Developers

From class android.content.ContextWrapper void attachBaseContext(Context base) Set the base context for this ContextWrapper. boolean bindIsolatedService(Intent service, int flags, String instanceName, Executor executor, ServiceConnection conn) Variation of

developer.android.com

서비스는 백그라운드에서 장기 실행 작업을 수행 할 수있는 응용 프로그램 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 응용 프로그램 구성 요소는 서비스를 시작할 수 있으며 사용자가 다른 응용 프로그램으로 전환하더라도 백그라운드에서 계속 실행됩니다. 또한 구성 요소는 서비스와 바인딩하여 상호 작용하고 프로세스 간 통신 (IPC)을 수행 할 수도 있습니다. 예를 들어, 서비스는 백그라운드에서 네트워크 트랜잭션 처리, 음악 재생, 파일 I / O 수행 또는 컨텐츠 제공자와 상호 작용할 수 있습니다.

 

< 자바 포인트 사이트에서 말하는 Service >

Android service is a component that is used to perform operations on the background such as playing music, handle network transactions, interacting content providers etc. It doesn't has any UI 

Android 서비스는 음악 재생, 네트워크 트랜잭션 처리, 컨텐트 프로바이더의 상호 작용 등과 같은 백그라운드에서 조작을 수행하는 데 사용되는 구성 요소입니다. UI가 없습니다.

The service runs in the background indefinitely even if application is destroyed.

Moreover, service can be bounded by a component to perform interactivity and inter process communication (IPC).

서비스는 앱이 destroyed 된 후에도 백그라운드에서 무기한으로 실행됩니다.

또한, 서비스는 컴포넌트에 의해 bind 되어 상호작용 및 프로세스간 통신 (IPC)를 수행할 수 있습니다.

 

3. Service 가 무엇인지 알아보기

Android Developers - 서비스에는 3가지 종류가 있다.

1. Foreground

Foreground Service는 사용자에게 눈에 띄는 일부 작업을 수행합니다. 예를 들어, 오디오 앱은 Foreground Service를 사용하여 오디오 트랙을 재생합니다. Foreground Service는 알림을 표시해야합니다. Foreground Service는 사용자가 앱과 상호 작용하지 않아도 계속 실행됩니다.

2. Background

Background Service는 사용자가 직접 알지 못하는 작업을 수행합니다. 예를 들어 앱이 서비스를 사용하여 스토리지를 압축 한 경우 일반적으로 Background Service가됩니다.

3. Bound

bindService ()를 호출하여 응용 프로그램 구성 요소가 바인딩 될 때 서비스가 바인딩됩니다. 바인딩 된 서비스는 구성 요소가 서비스와 상호 작용하고, 요청을 보내고, 결과를 받고, 프로세스 간 통신 (IPC)을 통해 프로세스간에 수행 할 수있는 클라이언트-서버 인터페이스를 제공합니다. 바인딩 된 서비스는 다른 응용 프로그램 구성 요소가 바인딩 된 경우에만 실행됩니다. 여러 구성 요소가 한 번에 서비스에 바인딩 될 수 있지만 모든 구성 요소가 바인딩 해제되면 서비스가 삭제됩니다.

 

Java Point - 서비스에는 크게 두 종류의 형태가 있다. 서비스의 생명주기는 다음의 두 path 에 따라 달라진다.

1. Started

2. Bound

1) Strated Service

서비스가 액티비티와 같은 컴포넌트가 startService() 메소드를 호출할때 시작된다. 그리고 이것은 백그라운드에서 무기한으로 동작한다. 한번 시작된 서비스는 stopService() 메소드가 호출되면 정지한다. 서비스는 stopSelf() 메소드를 호출하여 자기자신을 정지시킬 수 있다.

2) Bound Service

서비스가 다른 컴포넌트(예를 들면 cilent 컴포넌트와 같은)가 bindService() 메소드를 호출할때 bind 된다. client 는 unbindService() 메소드를 호출하여 서비스를 unbind 할 수 있다. 서비스는 client 가 unbind 할때까지 멈출 수 없다.

4. Service 를 왜 사용하는지 알아보기

Started Service 와 Bound Service 를 이해하기 - 배경음악 재생 예를 가지고

만약 내가 백그라운드에서 음악을 실행하고 싶으면, startService() 메소드를 호출한다. 그러나 내가 현재 재생되고 있는 음악의 정보를 알고 싶으면, 현재 재생중인 음악의 정보를 제공하는 컨텐트 프로바이더와 서비스를 bind 할 것이다.

 

* Choosing between a service and a thread : 쓰레드와 서비스 중에서 무엇을 선택할 지 고르기

서비스는 간단히 말해서, 사용자가 나의 앱과 상호작용하지 않는 순간에도 백그라운드에서 동작할 수 있는 컴포넌트이다. 그래서 나는 내가 정말로 필요할때만 서비스를 만들어야 한다.

만약 내가 사용자가 내 앱과 상호작용하는 순간에만 메인 스레드 바깥에서 작업을 수행해야 한다면, 나는 다른 스레드를 만들어서 작업해야 한다. 예를 들어서, 만약 내가 액티비티가 동작중일때만 음악을 실행하고 싶다면, 나는 onCreate() 에 스레드를 만들고, onStart()에서 동작을 시작하고, onStop()에서 멈추도록 해야한다. 또한 전통적인 Thread 클래스 대신에 AsyncTask 나 Handler Thread 사용을 고려해야한다. https://developer.android.com/guide/components/processes-and-threads.html#Threads 스레드에 대한 정보를 원한다면 링크로...

서비스 사용을 원한다면, 서비스가 내 앱의 메인 쓰레드 내에서 기본적으로 계속 동작하므로, 집중적인 작업이나 차단 작업을 수행해야하는 경우에는 서비스 안에 새 스레드를 작성해야한다는 사실을 기억해야 한다.

 

5. Service 를 어떻게 사용하는지 알아보기

https://developer.android.com/guide/components/services#Basics

서비스를 사용하려면, 서비스의 서브 클래스를 작성하거나, 기존의 서비스의 서브 클래스 중 하나를 사용해야 한다. implement 를 할때, 서비스 수명주기의 주요 측면을 처리하고 해당되는 구성 요소를 서비스에 바인딩할 수 있는 메커니즘을 제공하는 callback 메서드를 overriding 해야한다. 

onStartCommand() : The system invokes this method by calling startService() when another component (such as an activity) requests that the service be started. When this method executes, the service is started and can run in the background indefinitely. If you implement this, it is your responsibility to stop the service when its work is complete by calling stopSelf() or stopService(). If you only want to provide binding, you don't need to implement this method.

이 메서드를 구현하면, stopSelf() 나 stopService() 메서드를 호출하여 서비스의 작업이 완료된 경우 서비스가 종료될 수 있도록 해야한다.

onBind() : The system invokes this method by calling bindService() when another component wants to bind with the service (such as to perform RPC). In your implementation of this method, you must provide an interface that clients use to communicate with the service by returning an IBinder. You must always implement this method; however, if you don't want to allow binding, you should return null.

이 메서드는 다른 컴포넌트에서 서비스에 바인딩하고 싶을때 호출한다. 이 메서드를 구현하면, 클라이언트가 서비스와 통신할 수 있게하는 IBinder 인터페이스를 제공해야 한다. 이 메소드는 항상 implement 해야하고, 바인딩을 원하지 않으면 null 값을 리턴하게 하면 된다.

onCreate() : The system invokes this method to perform one-time setup procedures when the service is initially created (before it calls either onStartCommand() or onBind()). If the service is already running, this method is not called.

서비스가 처음 생성될 때 일회성 설정 철차를 수행하기 위해 이 메소드를 호출한다. 서비스가 실행중인 경우에는 이 메소드는 호출되지 않는다.

onDestroy() : The system invokes this method when the service is no longer used and is being destroyed. Your service should implement this to clean up any resources such as threads, registered listeners, or receivers. This is the last call that the service receives.

시스템은 서비스가 더이상 사용되지 않고 파괴될 때 이 메소드를 호출한다. 서비스는 스레드, 등록된 리스너 또는 수신자와 같은 자원을 정리하기 위해 이를 구현해야 한다. 이것은 서비스가 마지막으로 받게 되는 메서드이다.

Comments