0. 목차
Ⅰ. 개요
0. 서론
1. Service와 Thread의 차이
2. Service의 종류
3. Service의 제한
Ⅱ. Broadcast 제한
Ⅲ. Background 작업 제한
1. Background. 실행 제한
2. Backround에서 Activity 시작에 대한 제한 사항
Ⅰ. 개요
0. 서론
필연적으로 Background Service는 사용할 수 밖에 없습니다.
하지만, 이전과는 다르게 Android는 Background Service에는 호의적이지 않습니다.
업무와 관련되어서 자세히 찾아보게 되었고, 이를 공유하고자 정리해서 포스팅합니다.
1. Service와 Thread의 차이
Service란 Background에서 오래 실행되는 작업을 수행할 수 있는 Application 구성요소로, 사용자 인터페이스를 제공하지 않습니다. Main Thread에서 오래 실행되는 작업이나 많은 자원을 요한은 작업은 ANR을 유할하기 때문에 별도의 Thread에서 수행해야 합니다. 즉, 앱이 비활성화되어도 지속되어야 하는 작업은 Service로, 앱이 활성화되었을때 필요한 작업은 Thread에서 수행하는것이 바람직합니다.
2. Service의 종류
Android에서는 Service의 종류를 Foreground, Bind, Background 세 종류로 분류합니다.
3. Service 제한
디바이스의 리소스는 유한하므로, 무절제한 Application의 Service작업은 과도한 리소스 사용으로 배터리를 빠르게 소진시키거나,
정작 사용자가 사용하고 있는 작업의 수행을 방해할 수 있습니다. 그렇기때문에 Android는 사용자 환경의 개선을 위하여 앱이 비활성일때 구동되는 Service를 API level 26부터 본격적으로 제한하게 되었습니다.
Ⅱ. Broadcast 제한
API level 24부터 제한하기 시작했으며, API level 26에서 제한을 더욱 강화하였습니다.
목적지가 없는 암시적 Broadcast들은 Manifest가 아닌 Context에 수신기를 구현해 받아야 합니다.
하지만, 예외도 존재합니다. Android System이 발송하는 몇가지 암시적 Broadcast들인데요,
기기의 필수 기능을 제공하거나, 자주 발생하지 않는 기기의 중요한 이벤트들은 예외로 Manifest의 Broadcast receiver로 수신받을 수 있습니다.
Ⅲ. Backgroud 작업 제한
Android에서는 개요에서 설명한 바처럼, 사용자 환경 개선을 위해 Background service를 꾸준히 제한해 왔습니다.
아래의 표는 버전별 background 정책 변화에 대한 요약입니다.
Job Scheduler | API level 21 (Lollipop) |
작업을 미루거나 스케쥴링이 가능하도록 등장했고,높은 빈도로 호출되며 폭주하는 Application을 제한합니다. |
|
doze, stand by (잠자기 및 앱 대기모드) | API level 23 (Marshmallow) |
doze mode는 기기가 전원에 연결되어 있지 않거나, 오랫동안 사용하지 않는 경우 Application의 Background 활동을 지연시켜 배터리 소모를 줄입니다. stand by는 최근 사용자와 상호작용이 없는 앱의 백그라운드 네트워크 활동을 지연시킵니다. 이후 충전시에 stand by 모드가 해제되며 미뤄진 작업을 처리합니다. |
|
doze mode 개선 | API level 24 (Nugat) |
doze모드가 2단계로 세분화되었습니다. |
|
Background 실행 제한 | API level 26 (Oreo) |
앱을 Foreground와 background로 분류해 background 작업을 강력히 제한하였습니다. 아래에 자세히 서술되어 있습니다. |
|
Background 위치사용 제한 | API level 26 (Oreo) |
소비전력 절감을 위해 Background Application이 사용자의 현재 위치를 검색할 수 있는 빈도를 제한합니다. 단, Foreground Application의 동작은 해당되지 않습니다. |
|
App Standby buckets | API level 28 (Pie) |
Application의 사용빈도 정보에 기반해 리소스 요청의 우선순위를 정하며, 사용가능한 리소스를 제한합니다. |
|
Battery Saver1 | API level 28 (Pie) |
절전모드 및 Battery Saver가 Background 실행 제한이 모든 Application에 적용되고, Background Application의 Network acsess를 제한하는 등 강화되었습니다. |
1. Background 실행 제한 - API level 26 (Oreo)
Application을 Background와 Foreground로 구분합니다.
- 사용자에게 보이는 Activity가 있음
- foreground Service가 있음
- pplication의 Service중 하나에 바인드가 됨
- Content Provider를 사용해 Application에 다른 Foreground Application에 연결된 경우
- IME(ex: soft keyboard), 배경화면 Service, 알림 Listener, 음성 또는 text service
위의 경우가 아니라면, Application이 background에 있는 것으로 간주합니다. Application이 Background로 이동하게 되면, 몇 분 정도의 허용시간만 주고 System은 Background Service를 바로 종료시킵니다.
단, 아래의 경우에는 예외적으로 백그라운드 앱이 몇분동안 임시 허용 목록에 들어가기도 합니다.
- 우선순위가 높은 FCM 메시지 처리 - 단, 상호작용 할 패턴이 없다면, 메시지의 우선순위가 낮아질 수 있습니다.
- Broadcast 수신 (SMS, MMS 등)
- 알림에서 pendingIntent 실행
- VPN Application이 Foreground로 승격되기 전, Vpn Service 시작
2. Background에서 Activity 시작에 대한 제한 사항1 – API level 29 (Android 10)
Activity를 시작하기 위해 Foreground Service를 실행하는 앱은 Background에 있는 것으로 간주합니다. 그래서 알람으로 대신 표시하거나, 예외 조건을 하나이상 충족시켜야 시작할 수 있습니다. 예외 조건중 일부는 아래와 같습니다. (참고)
- Application의 Activity가 존재할 경우
- 가장 최근에 시작된 Activity가 Application에 있는 경우
- Application이 UI를 실행해야 하는 system broadcast를 수신하는 경우
- ACTION_NEW_OUTGOING_CALL, SECRET_CODE_ACTION 등 - System에 바인딩된 서비스가 앱에 있는 경우 - Incall Service, CallRedirectionService 등
- 해당 Application이 SYSTEM_ALERT_WINDOW(다른 앱 위에 표시)권한을 얻었을 경우
참고 문서들
https://developer.android.com/guide/components/services?hl=ko
https://developer.android.com/about/versions/oreo/background?hl=ko#broadcasts
https://developer.android.com/guide/components/broadcast-exceptions?hl=ko
https://developer.android.com/about/versions/android-5.0?hl=ko
https://developer.android.com/about/versions/marshmallow/android-6.0-changes
https://developer.android.com/about/versions/nougat/android-7.0-changes
https://developer.android.com/about/versions/oreo/background?hl=ko#broadcasts
https://developer.android.com/about/versions/oreo/background-location-limits?hl=ko
https://developer.android.com/topic/performance/appstandby
https://developer.android.com/about/versions/pie/power
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko
https://developer.android.com/guide/components/activities/background-starts?hl=ko
'IDE & Framework > Android' 카테고리의 다른 글
[Kotlin] ViewPager2 사용하기 (0) | 2022.01.31 |
---|---|
[Kotlin] RecyclerView (1) - 기본 예제 (0) | 2022.01.30 |
[Kotlin]local properties에 변수 저장하기 (3) | 2022.01.22 |
[Kotlin] Broadcast recevier란? 사용법과 예제 (1) | 2022.01.15 |
[Kotlin] Broadcast 란? 사용법과 예제 (0) | 2022.01.15 |