Android - Application과 CallbackInterface

woga·2022년 11월 20일
1

Android 공부

목록 보기
41/49

Application도 액티비티나 Service와 마찬가지로 ContextWrapper를 상속한다.
Application은 단독으로 시작하진 않는다. 앱 프로세스가 떠있지 않은 상태에서 다른 컴포넌트가 실행 요청을 받으면, 앱 프로세스가 생성되고 Application이 먼저 시작된다. 그리고 그 이후에 해당 컴포넌트가 실행된다.

즉 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더 가운데서 어느 것이든지 외부에서(앱 아이콘, 노티피케이션, 알람, 다른 앱 등) 실행을 요청할 경우, 앱이 이미 실행되어 있다면 바로 해당 컴포넌트를 시작한다.
아닐 경우 Application(class)을 먼저 시작하고 해당 컴포넌트를 시작한다.

Application onCreate() 실행되는 시점을 주의하자.
알다시피, Application onCreate()보다 ContentProvider onCreate()가 먼저 실행됨을 잊지 말자.

참고로 ActivityThreadhandlerBindApplication() 메서드에서 Application onCreate()를 실행한다

Application 인스턴스?

Context만 전달된다면 Context의 getApplicationContext() 메서드로 언제든지 Application 인스턴스를 구할 수 있다. Activity에서는 getApplication() 메서드를 사용해서 가져오기도 한다.

앱 초기화

Application은 다른 컴포넌트보다 먼저 실행되기 때문에 앱을 위한 초기화 작업을 Application onCreate()에서 주로 실행한다.

그치만 이 메서드는 가능한 빨리 끝나야 한다. 이 때 메서드에서 시간이 오래 걸린다면 앱 아이콘 -> 액티비티 시작할 때 검은 화면이 오래 보이거나 화면이 늦게 뜨는 현상이 발생할 수 있다.

그렇기 때문에 UI 블로킹을 최소화하기 위해 스레드에서 작업을 실행하기도 한다.

참고로 back 키로 액티비티를 다 벗어나도 프로세스가 바로 종료되지 않는다. 종료했다가 바로 앱 아이콘을 눌러도 Application의 onCreate()가 실행되지 않는다.

Application은 전역적으로 유지가 가능한데, 그 이유는 ActivityThread에 mInitialApplication이라는 멤버 변수로 있기 때문이다. 그래서 앱이 살아있는 동안 계속 유지되며 앱 상태를 저장하기에 좋은 조건을 갖고 있다.

Application 콜백

Application에서는 onCreate() 메서드만 오버라이드하는 경우가 많지만, 다른 메서드도 유용한 경우가 있다.
Application의 메서드 가운데서 registerXXX/unregisterXXX 메서드를 제외하면 ComponentCallback2 인터페이스의 2개 메서드가 있다.
Application과 Activity 뿐만 아니라 Service와 ContenProvider, Fragment도 ComponentCallback2 인터페이스를 구현하고 있다.

Application의 onTerminated() 메서드는 일부러 만든 조건(emulated process)에서나 동작하고 실제 단말에서는 동작하지 않으므로 무시해도 된다.

그럼 이 콜백 인터페이스에는 어떤 메서드가 있느냐?

onConfigurationChanged(Configuration newConfig)

구성이 변경되면 Application -> Activity -> Service -> ContentProvider 순으로 onConfigurationChanged() 불린다.

구성 변경 시에 반드시 필요한 작업이 있다면 Application onConfigurationChanged()에서 진행하면 된다.

onLowMemory()

전체 시스템에 메모리가 부족해서 모든 백그라운드 프로세스가 강제 종료될 가능성이 있을 때 호출된다. 잡고 있는 캐시나 불필요한 리소스를 해제하는 작업을 하면 된다

ICS(아이스크림 샌드위치)이상에서는 onTrimMemory()에서 메모리 해제 작업을 하는 것을 권장한다. GC는 onLowMemory() 리턴 이후에 실행된다.

onTrimMemory(int level)

ICS부터 사용 가능하다. 파라미터에 전달되는 level에 따라 onLowMemory() 메서드보다 세분화해서 처리할 수 있다. level에는 ComponentCallback2의 상수 값이 전달된다.

ComponentCallbacks 인터페이스

ICS 이전에 ComponentCallbacks은 Application에 onConfigurationChanged(), onLocwMemory()로 있었다.
ICS 이상에서는 onTrimMemory() 메서드가 추가되고 콜백을 여러 개 등록할 수 있게 하였다. onTrimMemory()는 ComponentCallbacks이 아닌 이를 상속한 ComponentCallbacks2 인터페이스에 있으므로 onTrimMemory()를 쓸 때는 registerComponentCallbacks()에 ComponentCallbacks2 구현체를 넘기면 된다.

마무리

사실 콜백이야기와 애플리케이션 이야기가 더 자세하게 있는데 글 자체가 루즈해져서 컴팩트하게 적어봤다. 콜백메서드에 대해 알았지만 이 친구의 역사가 있는지도 첨 알았다 (콜백 2...)

자세한 건 안드로이드 프로그래밍 NextStep Application 편을 참고해주길 바란다!

profile
와니와니와니와니 당근당근

2개의 댓글

comment-user-thumbnail
2024년 5월 17일

안녕하세요. 위 본문에 대한 내용을 어떤 책, 사이트 혹은 강의를 통해 알게 되셨는지 궁금해 댓글을 남깁니다.
관련된 내용의 출처를 여쭤봐도 괜찮을까요? (딥하게 공부하고 싶어 여쭤봅니다..! 😊)

1개의 답글