티스토리
android
안드로이드
안드로이드 Context 개념 익히기
Context is the Interface to global information about an application environment.
컨텍스트는 애플리케이션의 environment에 대한 전역 정보를 위한 인터페이스다.
안드로이드 개발이 꽤나 쉽지 않다는 걸 알았다. 그래서 해보고 싶었다. 아니 해야한다 생각했다. 온갖 버그가 안드로이드 SDK안부터 서드파티 라이브러리까지 존재할 뿐만 아니라 파편화 또한 아이폰과 비교도 안될만큼 심하다는 게 시제품을 만드는 안드로이드 개발자 옆을 지키며 내가 안드로이드 공부를 시작하게 된 이유다. 내가 조금이라도 일을 더 도와준다면, 조금 더 빨리 완성되지 않을까 해서. 조금이라도 도움이 되지 않을까 하는 마음에 공부하기로 했다. 예전 Servlet/JSP, Spring등을 다룰 때 JAVA를 했던 기억을 더듬어 가며(놀랍게도 벌써 그개 3년이나 됐다는 걸 알았다), 안드로이드 공부를 시작하려 한다.
안드로이드 개발자 뒤에서 항상 보던 getApplicationContext()
라는 함수가 기억났다. 왜 안드로이드는 맨날 저걸 던져줘야 하는건가 라는 생각이 항상 들었지만 한번도 그 이유가 제대로 궁금한 적은 없었다. 그냥 귀찮은 처리가 많은 개발 플랫폼이구만 이라고 생각했을 뿐.
안드로이드의 Context 개념은 안드로이드 디벨로퍼에 따르면, 위와 같다. 현재 사용되고있는 앱에 대한 전역 환경 정보를 가진 친구라고 한다. 이게 무슨 뜬구름 잡는 소린가.
여기 스텍오버플로우 글에서 많은 인사이트를 얻었다.
getApplication()
, getApplicationContext()
, getBaseContext()
, getContext()
, 그리고 SomeClass.this
까지 이게 뭐가 다른지에 대한 질문이었다.
즉,
Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
이 친구들과
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
이 친구들 각각이 뭐가 다른지에 대한 것을 궁금해 하는 듯 했다. 나 또한 안드로이드 생초보지만, 어깨 넘어로 본 게 있어서 뭐가 다른지 궁금했다.
안드로이드 프레임워크에서 Context는 2가지 종류로 나뉜다.
- 애플리케이션 Context
- 액티비티 Context
애플리케이션 Context는 애플리케이션 자체의 생명주기(라이프사이클)에 영향을 받는다. 따라서 항상 애플리케이션의 생명 주기와 함께 한다.
그러나 엑티비티 Context는 액티비티의 라이프사이클과 함께 작동해, onDestory()
와 함께 사라진다. 즉 액티비티에 대한 환경 정보들이 Context에 있고, 이 Context(엑티비티의)에 Intent를 통해 다른 액티비티를 띄우면, 엑티비티 스택이 쌓이게 되는 것이다.
LoginActivity.this
though its referring to your own class which extends Activity class but the base class (Activity) also extends Context class, so it can be used to offer activity context.
getApplication()
though its referring to Application object but the Application class extends Context class, so it can be used to offer application context.
getApplicationContext()
offers application context.
getBaseContext()
offers activity context.
세부적인 설명인데, 여기서 중요한 것은 안드로이드의 Avtivity와 Apllication class들이 모두 Context
클래스를 상속받아 만들어졌다는 것이다. 그래서 LoginActivity.this
라고 하는 순간, this
에 해당하는 LoginActivity
인스턴스가 파라매터로 전달되고, 이것은 Context
를 상속받았기에 Context
이며, 따라서 아무런 문제 없이 작동하게 되는 것이다.
Tips: 뷰를 수정하거나 할때는
Activity Context
를 나머지 경우에는Application Context
를 사용하라.
다음은 액티비티의 생명주기에 대해서 공부를 해보아야 겠다.
'Develop' 카테고리의 다른 글
Android Support Library란? (0) | 2016.06.02 |
---|---|
[번역] FLUX 페이스북 클라이언트 사이드 웹 애플리케이션 아키텍처 (0) | 2016.06.01 |
안드로이드 엑티비티란? (0) | 2016.06.01 |
Redis(레디스)의 구현과 내부 구조, 작동 원리 - 1 (0) | 2015.08.23 |
nodejs로 Azure(애저) 클라우드 알림 허브 푸시알림 보내기 (0) | 2015.05.20 |
우분투 시작시 자동으로 특정 명령 실행하기. (0) | 2015.03.17 |
도커란 무엇인가 / Docker 컨테이너 / Docker 이미지 / LXC / 가상화 (0) | 2015.03.09 |
브라우저 위치 정보 받아오기 / HTML5 Geolocation API (0) | 2015.01.03 |
워드프레스 설치 준비하기 - 우분투와 MariaDB, Apache, PHP와 함께. (0) | 2014.12.31 |
Pymongo tutorial (파이몽고 사용하기) / pymongo 번역 (0) | 2014.10.29 |