-
[안드로이드] ContextAndroid📱 2022. 3. 28. 18:52
Context?
문맥?
안드로이드의 Context란 무엇일까.
한글로 번역해보면 문맥이라는 뜻을 갖고 있다.
안드로이드의 문맥?직역으로 보면 뭔가 와닿지가 않는다.
Context의 코드로 이동을 해서 보면 멀리 가지 않아도 변수 명부터 SERVICE라는 단어가 많이 보인다.
여기서 우리는 안드로이드의 Context는 어떤 배경, 맥락을 나타내는 기능을 하는 것이라는 것을 유추해볼 수 있다.그리고 실제로
Activity, Application, Service가 모두 Context를 상속받고 있다.
공식문서의 Context 개요를 살펴보면
- Application 환경의 전역 정보에 대한 인터페이스
- Android 시스템에서 구현을 제공하는 추상 클래스
- Application별 리소스 및 클래스에 대한 액세스, Activity 시작, 브로드캐스트 및 수신 인텐트 등과 같은 Application 수준 작업에 대한 호출을 허용
한다는 것을 알 수 있다.
그래서 Context를 사용하면 getPackageName(), getResource(), startActivity(), startService(), getSystemService()와 같은
시스템 레벨의 정보를 얻을 수 있는 메서드를 사용할 수 있게 된다.
또 시스템의 리소스 확인, 데이터베이스 및 환경 설정에 대한 액세스 확보 등과 같은 서비스도 제공한다.그리고 이것을 상속받은 Activity도 Application의 환경 정보, 클래스 등에 접근할 수 있게 된다.
Context의 사용
그렇다면 Context를 어떻게 사용해야 할까?
종류
일단 Context는 두 가지가 있다.
Application Context와 Activity Context이다.- Application Context
- Application과 관련이 있다.
- Application이 살아있는 동안 변경되지 않음
- 싱글톤
- getApplicationContext()를 통해서 Activity에서 접근 가능
- Activity의 Scope가 벗어난 작업을 할 때 필요
- Activity Context
- Activity와 관련이 있다.
- Activity가 부서지면 함께 소멸
- Application에 있는 여러 Activity에서 특정 Activity의 Context를 다룰 때 사용
- 예) 새로운 Activity를 실행할 때
- 새로 실행된 Activity는 이전 Activity와 연관된 채로 Activity Stack에 저장
- Application Context를 이용하여 새로운 액티비티를 띄울 수도 있음
- 그럴 경우 반드시 Intent.FLAG_ACTIVITY_NEW_TASK 플래그를 설정
- 예) 새로운 Activity를 실행할 때
나누어서 써야 하는 이유
이 둘을 나누어서 잘 사용해야 하는 이유는 위 설명에 힌트가 있다.
위에 설명처럼 Application Context는 Application과 관련이 있고, Activity Context는 Activity와 관련이 있다.
그리고 Activity는 Application 안에 존재는 것이 때문에 만약 Application Context를 참조해야하는 상황에서 Activity Context를 사용하게 되면
일 하는 중에 퇴근을 한 신입 사원처럼 Activity는 이미 소멸하고 없는데, 그 Activity의 Context는 계속 참조를 받고 있어서 GC가 작동하지 않아 메모리 누수가 발생하게 된다.
그러면 Application Context만 사용하는 되는 것일까?
그것도 아니다. Application Context는 GUI 관련 작업을 진행할 수가 없다.하지만 Toast는 되는 것을 볼 수 있는데, 그 이유는 Toast는 자신만의 윈도우를 생성하기 때문이다!
- 참고
'Android📱' 카테고리의 다른 글
[Recycler View] Recycler View : adapter (0) 2022.03.29 [안드로이드] Back Stack??? (0) 2022.03.28 [ERROR] Can't toast on a thread that has not called Looper.prepare() (0) 2022.03.25 [Android] Custom View와 Activity의 좌표가 다른 문제 (0) 2022.03.18 [안드로이드 오류] Cannot resolve symbol (0) 2022.03.12