훌륭한 개발자가 되기 위하여
[Android | Kotlin] 백그라운드 제약 본문
리시버의 백그라운드 제약
- 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없습니다.
- 매니페스트에 등록한 리시버를 명시적으로 실행하는 것은 정상
- registerReceiver( ) 함수로 등록하면 암시적 인텐트로도 잘 실행
- 매니페스트에 등록한 리시버를 암시적으로 실행할 때는 같은 앱의 리시버든 외부 앱의 리시버든 실행되지 않습니다.
// 브로드캐스트 리시버 등록
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("kim", "outer app dynamic receiver")
}
}
registerReceiver(receiver, IntentFilter("ACTION_OUTER_DYNAMIC_RECEIVER"))
// 암시적 인텐트로 브로드캐스트 리시버 실행
val intent = Intent("ACTION_OUTER_DYNAMIC_RECEIVER")
sendBroadcast(intent)
서비스의 백그라운드 제약
- 서비스는 앱이 백그라운드 상태일 때 인텐트를 전달하면 오류가 발생
안드로이드 시스템에서 서비스가 정상으로 실행되는 포그라운드 상황
- 액티비티가 시작되든 일시 중지되든 상관없이 보이는 액티비티가 있을 때
- 포그라운드 서비스가 있을 때
- 앱의 서비스에 바인딩하거나 앱의 콘텐츠 프로바이더를 사용해 또 다른 포그라운드 앱이 연결되었을 때
앱이 백그라운드 상황이더라도 다음과 같은 경우에는 서비스가 정상으로 실행
- 우선순위가 높은 파이어베이스 클라우드 메시징(FCM) 처리
- SMS / MMS 메시지와 같은 브로드캐스트 수신
- 알림에서 PendingIntent 실행
- VPN 앱이 포그라운드로 승격되기 전에 VpnService 시작
startForegroundService( ) 함수로 인텐트를 시작하면 앱이 백그라운드 상황에서도 서비스가 실행
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
- 앱이 백그라운드 상황에서 startForegroundService( ) 함수로 실행한 서비스는 얼마 후 오류가 발생하면서 강제로 종료가 되기 때문에, 빨리 startForeground( ) 함수를 호출해 포그라운드 상황으로 만들어야 합니다.
- 즉, 앱이 백그라운드 상황이더라도 startForegroundService( ) 함수를 이용하면 서비스를 실행할 수 있지만, 빨리 알림을 이용해 앱을 포그라운드 상황으로 만들어 사용자에게 앱이 실행되고 있다는 것을 알려야 합니다.
// 서비스 쪽 코드
val notification = builder.build()
startForeground(1, notification)
// 매티페스트에 퍼미션 등록
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
'안드로이드' 카테고리의 다른 글
[Android | Kotlin] 콘텐츠 프로바이더 이해하기 (0) | 2024.01.03 |
---|---|
[Android | Kotlin] 잡 스케줄러 (1) | 2023.12.31 |
[Android | Kotlin] 바인딩 서비스 (0) | 2023.12.29 |
[Android | Kotlin] 서비스 이해하기 (0) | 2023.12.29 |
[Android | Kotlin] 시스템 상태 파악하기 (0) | 2023.12.28 |