코루틴은 Android 백그라운드에서 돌아갈까?

Lee Jeong-hwan·2024년 10월 29일

오늘은 Android에서 우리가 흔히 눌러 볼 수 있는 Task 버튼과 코루틴에 대해서 알아보려 한다.
문득, 궁금했다.

과연 코루틴이 돌아가고 있는 상태에서 UI를 갱신하는 코루틴은 정상 작동할 까?

필자의 생각으로는 UI는 MainThread에서 작업이 이뤄지고, 사용자가 앱을 Task 버튼을 누르거나 홈으로 이동하면 자동으로 백그라운드로 넘어간다.

위와 같은 이유 때문에 뭔가 앱이 강제 종료되거나, UI가 갱신되지 않거나, 혹은 코루틴이 종료될 것 같았다.


🔍 만들어보자.

Step 1. 제일 먼저 테스트에 사용할 XML을 하나 추가해 보자.

위와 같이 "num_tv"라는 Id를 가진 텍스트 뷰 1개를 추가했다.

Step 2. 코루틴으로 UI를 갱신하는 코드를 작성해 보자.

CoroutineScope(Dispatchers.Main).launch {
            repeat(1000) {
                tv.text = it.toString()
                Log.d(TAG, it.toString())
                delay(1000)
            }
        }

tv는 Step 1에서 선언한 텍스트 뷰이며, 상속 관련 내용은 생략하겠다.
해당 코드는 텍스트 뷰를 1초마다 repeat count를 받아와 설정해 주고, Log를 출력해 주는 코드이다.

테스트 앱이 onStop()을 받아 백그라운드로 잘 넘어갔는지 확인하기 위해 아래 코드도 추가해 주자.

override fun onStop() {
        super.onStop()

        Log.d(TAG, "onStop...!")
    }

위 코드는 사용자가 홈 or Tesk 버튼을 눌렀을 때 호출될 것이다.

Step 3. 확인해 보자

위 이미지를 확인해 보면 아래와 같은 특징이 있다.

  1. onStop()이 호출되어 앱이 백그라운드로 넘어가도 코루틴은 정상 작동한다.
  2. 코루틴은 UI를 정상적으로 갱신하고 있었다.
  3. 앱을 다시 실행시키면 코루틴에서 작업하던 최신 UI를 기준으로 View를 보여준다.

⭐️ 이게 어떻게 가능한가요?

해당 내용은 Android 공식 문서의 일부 내용이다.
"뭔가 내용만 확인했을 때는 코루틴도 멈춰야 하지 않을까?" 하는 생각이 든다.

생명 주기 단계 내용을 확인해 보자.

캐시된 프로세스는 현재 필요하지 않은 프로세스이므로, 시스템은 메모리와 같은 리소스가 다른 곳에서 필요할 때 필요에 따라 자유롭게 이 프로세스를 종료할 수 있습니다.
정상적으로 작동하는 시스템에서는 리소스 관리와 관련된 유일한 프로세스입니다.
잘 실행되는 시스템에서는 효율적으로 애플리케이션 간에 전환할 수 있도록 여러 개의 캐시된 프로세스를 항상 사용할 수 있으며 필요에 따라 캐시된 앱을 정기적으로 종료합니다.

위 내용을 살펴봤을 때 수명 주기 단계에서 뭔가 완벽하게 종료되는 ex.) Kill 되는 상황이 생기지 않아 코루틴이 정상 작동하는 게 아닐까? 하는 생각이 든다.

나중에 Android 백그라운드 프로세스 처리에 대해서도 알아보면 좋을 것 같다.
위 2개의 내용과 사진은 아래 레퍼런스를 참고했다.


📝 Reference

profile
안녕하세요😁 안드로이드 개발자 이정환 입니다~⭐️

0개의 댓글