Application 클래스는 바로 Destroy되지 않는다.

지프치프·2023년 3월 17일
0

Android

목록 보기
62/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

Application 클래스란 앱이 실행될 때 가장 먼저 인스턴스화 되는 클래스로 Launcher로 설정한, 최초로 실행되는 Activity보다 먼저 인스턴스화가 진행된다.

일반적으로 Activity가 호출되기 전에 작업해야하는 코드나
앱 전역에서 공유되는 데이터를 초기화 하는 등의 용도로 사용된다.

필자는 이 Application 클래스의 onCreate에서
앱 전역에서 쓰이는 값을 초기화하는 코드를 작성했는데
앱을 재실행해도 값이 초기화되지 않고 남아있는 것이다.

재현경로

현상을 확인해보니 재현경로는 이러했다.

  • 앱 백그라운드 목록에서 강제종료 후 실행
    -> 정상작동
  • 뒤로가기로 종료 후 실행
    -> 정상작동 X

그래서 디버거를 찍어봤더니 Application 클래스의 onCreate()를
호출하지 않은 것이다.

원인

조사해본 결과 원인은 아래와 같다.

Application은 Activity뿐만 아니라 Service, ContentProvider 등을 가지고 있고 OS에서 메모리가 필요할 때 앱이 종료된 상태(여기서는 마지막 Activity까지 Destroy된 상태) 일 때 Application을 종료한다.

그래서 강제종료하면 Application 클래스도 같이 종료되기 때문에
onCreate()가 실행되고
뒤로가기로 종료했을 때는 Activity만 종료되고 Application 클래스는
종료되지 않았기 때문에 onCreate()가 호출되지 않은 것으로 보인다.

P.S

추가적으로 위 사이트에서 알게된 것은
Application 클래스는 생명주기가 매우 길기 때문에
Activity의 LifeCycle에 종속성을 갖게되면 메모리 누수가 발생할 수 있다고 하는 것 같다.

ApplicationContext가 AcitivityContext 대신 사용되면
메모리 누수가 일어나는 것과 같은 맥락인 것 같다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글