+본 게시글은 이전 [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부분이 오늘 이야기하고자 하는 플래그 부분입니다. 플래그는 아래와 같고, 각 플래그들은 어떤 작업이나 동작을 수행하는 동안 바인딩에 대한 옵션 또는 설정을 나타냅니다. 플래그 값으로 바인딩 옵션을 설정하여 연결된 서비스와의 동작을 제어하거나 구성할 수 있습니다.
|
- | - |
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#BIND_NOT_FOREGROUND
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] floating layout 라이브러리 사용해보기(수정본) (0) | 2023.10.11 |
---|---|
[Android][Java] Retrofit 라이브러리를 사용해서 서버에 파일 업로드하기(클라이언트) (0) | 2023.10.09 |
[Android][Java] 리사이클러뷰 로딩아이템 만들기 (0) | 2023.09.28 |
[Android][java] 서비스 onStartCommand()와 플래그 (0) | 2023.09.26 |
[Android][Java] 비트맵 합치기 PorterDuff.Mode (0) | 2023.09.23 |