Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

훌륭한 개발자가 되기 위하여

[Android | Kotlin] 백그라운드 제약 본문

안드로이드

[Android | Kotlin] 백그라운드 제약

jay20033 2023. 12. 31. 15:33

리시버의 백그라운드 제약

  • 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없습니다.
  • 매니페스트에 등록한 리시버를 명시적으로 실행하는 것은 정상
  • 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"/>