본문 바로가기
안드로이드 자바

[Android][java] 바인딩 서비스와 플래그

by teamnova 2023. 10. 7.
728x90

+본 게시글은 이전 [Android][java]서비스 onStartCommand()와 플래그에서 이어집니다.

 

 안녕하세요. 우리는 이전에 서비스 사용 시, onStartCommand() 메서드에서 리턴값으로 보내는 플래그에 대해서 알아보았습니다. 어떤 값을 리턴하느냐에 따라 서비스를 다르게 통제할 수 있었는데요, 오늘은 바인딩 서비스에서 쓰이는 플래그에 대해서 알아보려고 합니다. 

 

 이전 게시글(위 링크 참고바랍니다.)에서는 서비스 클래스 내부에 있는 생명주기 메서드 중 하나인 onStartCommand()에서 플래그를 사용했는데, 오늘 알아보려는 플래그는 바인딩 서비스의 활성 주기인 onBind()에서 쓰이는 값이 아니라,애플리케이션 구성 요소가 서비스와 바인딩할 때 사용하는 bindService()에 파라미터로 사용됩니다. onStartCommand() 때와 마찬가지로 플래그를 통해 서비스 연결(바인딩) 설정을 통제할 수 있습니다.

 

하지만 bindService() 메서드에 앞서 바인딩 서비스가 무엇인지 간략하게 알아봅시다. 

 

1. 바인딩 서비스(Bound Service) : 다른 구성요소와 bound 된 서비스. 

 

"애플리케이션 구성 요소(액티비티 등)가 bindService()를 호출하여 해당 서비스에 바인딩되면 서비스가 바인딩됩니다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(*IPC)으로 수행할 수도 있습니다. 바인딩된 서비스는 또 다른 애플리케이션 구성 요소가 이에 바인딩되어 있는 경우에만 실행됩니다. 여러 개의 구성 요소가 서비스에 한꺼번에 바인딩될 수 있지만, 이 모든 것에서 바인딩이 해제되면 해당 서비스는 소멸됩니다."
(출처: 안드로이드 공식 사이트)

*IPC: 프로세스 간 통신(Inter-Process Communication, IPC).  프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로. (출처: 위키피디아)

 

2. 바인딩 서비스의 생명주기. 

 

 

위 그림을 함께 보실까요. 바인딩 서비스는 bindService() 메서드로 서비스와 다른 애플리케이션 구성요소가 바인딩 되면서 시작합니다. 이때 사용되어지는 bindService() 메서드에 대해 알아봅시다. 

 

3. BindService()

 

 앱 서비스에 구성요소를 연결하고, 필요한 경우 서비스를 생성하는 메서드. (*단, BroadcastReceiver 구성 요소에서 호출할 수 없습니다.)  이 메서드를 통해 응용 프로그램과 서비스 간의 종속 관계를 정의할 수 있습니다. 지정된 연결은 서비스 개체가 생성될 때 서비스 개체를 수신하고 비활성화 및 재시작 여부를 알려줍니다. 서비스는 호출 컨텍스트가 존재하는 한에만 시스템에서 필요한 것으로 간주됩니다. 예를 들어 이 컨텍스트가 중지된 액티비티인 경우 액티비티가 재개될 때까지 서비스를 계속 실행할 필요가 없습니다.

*BindService() 메서드를 BroadcastReceiver 구성 요소에서 호출할 수 없습니다. : BroadcastReceiver에서 서비스로 통신할 때는 보낼 명령이 포함된 인수를 사용하여 startService(Intent)를 호출하고 Service.stopSelf(int)로 종료할 수 있습니다.  그러나  registerReceiver(BroadcastReceiver, IntentFilter)로 등록된 BroadcastReceiver에서는 사용해도 괜찮습니다. 이 *BroadcastReceiver의 수명은 다른 객체(등록한 객체)와 연결되어 있기 때문입니다.

 

3-1. BindService 문법

 

public abstract boolean bindService (Intent service, ServiceConnection conn, int flags)

 

3-2 파라미터 및 리턴 

 

파라미터
service  인텐트. 인텐트를 통해 연결하려는 서비스를 식별합니다. 인텐트는 명시적인 구성 요소 이름을 지정해야 하고 이 값은 null이 될 수 없습니다.
conn ServiceConnection: 서비스가 시작되고 종료될 때 정보를 받습니다. 이것은 유효한 ServiceConnection 객체여야 하며, 마찬가지로 null이 아니어야합니다.
flag int (정수)  바인딩에 대한 작업 옵션.  

*적용 가능한 값:

 

리턴
boolean 만약 시스템이 클라이언트가 바인딩 권한을 가진 서비스를 구동하려는 중이라면 true, 시스템이 서비스를 찾지 못하거나 클라이언트가 바인딩 권한을 가지지 않는 경우 false를 반환합니다. 반환값과 상관없이 나중에는 unbindService(ServiceConnection)를 호출하여 연결을 해제해야 합니다.

 

3-3. flag에 적용 가능한 값들.

 

위 3-1과 3-2에서 우리는 메서드와 파라미터, 그리고 리턴(반환)값을 알아보았습니다. 3-2에서 메서드의 파라미터로 들어가는 flag부분이 오늘 이야기하고자 하는 플래그 부분입니다. 플래그는 아래와 같고, 각 플래그들은 어떤 작업이나 동작을 수행하는 동안 바인딩에 대한 옵션 또는 설정을 나타냅니다. 플래그 값으로 바인딩 옵션을 설정하여 연결된 서비스와의 동작을 제어하거나 구성할 수 있습니다.

 

  • 0
- -
1 구성요소와 바인딩이 존재하는 한
서비스를 자동으로 생성.
2
- 디버깅 목적으로 사용하는 플래그.

-서비스와의 unbind 호출을 디버깅할 때 유용한 정보를 제공한다. 특히, 이 플래그를 사용하면 나중에 잘못된 unbind 호출이 발생했을 때 해당 호출 스택을 보존하여 문제를 식별하는데 도움을 준다.

- 그러나 디버깅 지원을 제공하기 위해서는 바인딩 정보를 앱의 수명 동안 유지해야 하므로 메모리 누수가 발생할 수 있다. (디버깅 용으로만 사용해야 함)

4 -바인딩 동작에서, 대상 서비스 프로세스의 스케줄링 우선순위에 관한 플래그.

- 이 플래그를 사용하면 바인딩을 통해 대상 서비스 프로세스의 스케줄링 우선순위를 포그라운드 스케줄링 우선순위로 높이지 않는다.

-
BIND_NOT_FOREGROUND 속성으로
서비스 바인딩을 하면 무조건 서비스는 Background 상태이다.
8
- 이 플래그를 설정하면 클라이언트 애플리케이션은 해당 서비스를 앱 자체보다 더 중요하게 여긴다고 표시한다.

- 이러한 설정은 메모리 부족 상황에서의 동작을 제어하기 위해 사용된다. 특히, 플랫폼은 메모리가 부족한 경우 해당 서비스를 종료하기보다는 클라이언트 애플리케이션을 종료하는 것을 우선 고려할 수 있다. 그러나 이 동작은 항상 보장되지 않으며, 메모리 관리 및 리소스 할당은 다양한 요소에 의해 결정될 수 있다.
이 플래그는 서비스와 앱 간의 상대적 중요도를 나타내는 데 사용된다.

16 -바인딩된 서비스를 호스팅하는 프로세스가 일반적인 메모리 관리를 수행하도록 허용한다.
32 - 이 플래그를 사용하면 대상 서비스의 프로세스가 스케줄링이나 메모리 관리 우선순위에 영향을 미치지 않고, 일반적인 백그라운드 애플리케이션 프로세스처럼 백그라운드 LRU (최근 사용한 목록) 목록에서 관리될 수 있다.
64 - 서비스가 클라이언트에게 매우 중요하며, 클라이언트가 화면 앞에 있을 때와 동일한 프로세스 수준으로 끌어올려져야 하는 경우 사용.

-다른 클라이언트가 이 서비스를
화면 뒤로 내리지 못함.
128 -액티비티에서 바인딩하는 경우, 액티비티가 사용자에게 보이는지 여부에 따라 대상 서비스 프로세스의 중요도를 높일 수 있도록 허용한다. 이 동작은 클라이언트 프로세스의 전체적인 중요도에 영향을 줄이기 위해 다른 플래그를 사용하는 경우와 관계없이 적용된다.
256 -앱이 화면에 표시되거나 사용자가 인지할 수 있는 상태에서 서비스를 바인딩하는 경우, 대상 서비스의 중요도가 인지 가능한 수준 아래로 낮춰진다. 이렇게 함으로써 시스템은 바인딩된 프로세스를 메모리에서 일시적으로 제거할 수 있다.

이 공간을 더 중요한 사용자가 인지할 수 있는 프로세스에 할당하여 사용자 경험을 향상시킬 수 있다.
512 -화면에 표시되는 앱에서 바인딩할 때, 바인드된 서비스가 백그라운드에서 활동을 시작할 수 있게 함.

그러나 SDK 버전 Build.VERSION_CODES.UPSIDE_DOWN_CAKE 이후로는 앱이 포그라운드에 있더라도 바인딩된 서비스가 백그라운드에서 활동을 시작하지 못하도록 기본 동작이 변경되었으므로  이 플래그가 바인딩 시에 지정되지 않는 한 그렇게 동작하지 않습니다. 
4096 - 애플리케이션 간의 서비스 바인딩에서 기능 및 권한 전달에 관한 플래그. 

-최상위 앱(액티비티나 포그라운드 서비스를 가진 앱)에서 바인딩할 때, 이 플래그를 사용하면 필요한 권한을 가진 한 바인드된 앱도 동일한 기능을 얻을 수 있습니다. 즉, 상위 앱의 기능 및 권한을 바인딩된 앱에 전달할 수 있다.

외 등등이 있습니다. 

 

+ 더 많은 내용은 아래 글을 참고 바랍니다. 

https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.Context.BindServiceFlags,%20java.util.concurrent.Executor,%20android.content.ServiceConnection) 

 

Context  |  Android Developers

 

developer.android.com

https://developer.android.com/reference/android/content/Context#BIND_NOT_FOREGROUND

 

Context  |  Android Developers

 

developer.android.com