상세 컨텐츠

본문 제목

[Android] Context

Develop/Android/IOS

by 웽디 2015. 8. 21. 16:41

본문

+ 출처가 빠진 부분이 있다면 말씀해주시면 바로 추가할께요. 제가 여러 사이트를 돌아다니면서 공부한 내용을 정리한 거라.. 혹시 빠졌다면 바로 말씀해주세요!


Context(컨텍스트) 란?


 

정리를 하면,

Context는 가장 중요한 존재입니다. 

자신이 누구인지, 어떤 어플리케이션인지, 어떤 프로세스인지.. 알려주는 키 값? 이기도 하고, 일반적인 플랫폼과는 다르게 안드로이드에서는 중요한 어플리케이션과 관련된 정보(시스템 레벨)에 접근해야 하는데, 그 때 꼭 필요한 것이 Context입니다.

 

 

일단 '정의' 부터 알아보면, 

http://developer.android.com/reference/android/content/Context.html


Class Overview 
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.


[번역] 

Application 환경에 관한 global 정보 접근을 위한 Interface. Abstract 클래스이며, 구현은 Android 시스템에 의해 제공된다.
Context를 통해서 Application에 특화된 리소스 or 클래스에 접근가능하고, 

추가적으로 Application level의 작업(Activity 실행/Intent 브로드 캐스팅/Intent 수신 등)을 수행하기 위한 API를 호출 할 수도 있다.

일단 개념적인 부분 부터 알고 가야겠네요~





Context 의 일반적인 의미?


멀티태스킹을 지원하는 운영체제는 Task들이 작업을 번갈아 가면서 작업하도록 기준을 정해두고 있습니다. 

이때, 해당 Task들의 수행상태를 기억하기 위해서 Task마다 실행 상태에 대한 정보를 구성하고 있는 것을 Context라 합니다.





Android에서의 Context 의 의미?


Android의 실행 & 종료 등 관리하는 책임자는 개발자가 아니라,

System Level에서 적절히 Life-cycle을 유지해가며 수행시켜주기 때문에,

실행하기 위한 객체들은 System Level에 등록을 해놔야 후에 실행이 가능합니다.



출처 : http://insnote.com/xe/kkang/348



System Level의 기능이나 정보 획득시에 필요한 것을 언제, 어떻게, 어떤 코드를 이용하여 얻어올 것인가.


때에 따라 / 객체에 따라 다를 수 있는데, 다르게 되면 너무 복잡하고 유지보수도 힘들고.. 그래서!! 


Android는 다형성을 사용하여 

코드를 통일성 있고, 일관된 방법을 유지할 수 있도록 

Context 클래스를 상속받도록 설계되어 있어요. 

( = Servlet/JSP의 ServletContext의 역할과 비슷)





Android에서의 Context 의 역할?


Context 클래스를 상속 확장한 클래스의 경우(Activity, Service...)에

* 시스템이 관리하고 있는 정보에 접근이 가능하고, 

* Android System Service에서 제공하는 API 호출도 가능합니다.


F3 F3 F3 F3을 눌러~ 타고 들어가서 보니 

Context라는 추상 클래스가 가지고 있는 함수들..................  

스크롤바만 봐도 아래에 쭉~ 어마어마하게 많네요. 




위의 Context 객체로 인해.. 편리해진 점!!!

[예] http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=967



[ Context가 Service컴포넌트 인 경우 ]



[ Context가 Activity컴포넌트인 경우 ]


인자를 보시면 Activity / Service context를 함수의 인자로 동일한 모습으로 넘길 수 있습니다. (Activity,Service 자체가 Context 라는 의미) 


만약 Context가 없다면, 

Intent의 생성자가 여러개가 되어야 하므로 매우 비효율적이겠죠~~ 


ex) Intent(Service service, .. )

    Intent(Activity activity, .. )




Context 얻어오는 방법?


여러가지 방법이 있는데, 잘 알고 사용해야 하는 것 같습니다. 


1) getBaseContext()


Context context = getBaseContext(); //생성자나 Context에서 기본 Base Context


2) getApplicationContext()


Context context2 = getApplicationContext(); // global한 Context


3) Activity이름.this



[설명]


1), 2) 두 함수는 scope에 차이가 있습니다. 


getBaseContext()는 앱 종료후에 메모리에서 제거가 되고, getApplicationContext() 는 특정한 Activity에 매여 있지 않아서 쭈욱 살아있기 때문에, 주기가 긴? Notification 등에 사용하는 것이 효율적입니다. 


2), 3) 의 차이를 보면, Activity이름.this는 Activity가 destory되거나, 다시 생성될 때마다 변경되고, getApplicationContext()를 이용하여 얻은 context는 application이 kill되거나 재시작될때마다 변경됩니다.


로그로 확인해보면, 다른 객체임을 알 수 있습니다.




#로그 결과




Context 종류, Type? 


[Activity / Service] 

ContextWrapper를 상속받아 구현한 Context로 실행시 고유한 Context를 가집니다.



[BroadcastReceiver]

자기자신이 Context가 아니고, onReceive()가 실행되면, Context를 가져올 수 있지만, 그 때의 Context는 ReceiverRestrictedContext입니다.(기존 Context가 아님)


Receiver가 broadcast를 처리 할 때마다 새로운 Context를 생성합니다.



[ContextProvider] 


BroadcastReceiver와 다르게 getContext()를 통해서 Context를 가져올 수 있습니다. 


하지만, 동일한 프로그램을 호출하게 되면 동일한 Context를 가질 수 있지만, 별도의 프로세스(프로그램)을 호출하게 되면 Provider가 실행되는 프로그램의 instance가 context로 반환됩니다. 

각각의 클래스/Object에 따라 사용되는 Context 정리된 표인데, 깔끔해서 가져왔습니다~아래 표를 참조해서 나의 프로젝트에 맞는 최적의 Context를 선택해서 사용하면 될것 같아요^^ 




출처 : http://www.kmshack.kr/android-context-what-context/

 


결론 


이렇게 Context의 개념을 알고 난 후에 코드를 짜게 되면, 

this 및 해당 영역(scope)에서 어떤 컨텍스트가 실행되고 있는지를 
제대로 알고 사용할 수 있기 때문에 오류가 발생해도 쉽게 찾을 수 있을 것 같아요~!!

 

Context에 관련 포스트 글들을 읽어보면, 열의 아홉은 어려운 개념이라 딱 정의를 내릴 수 없다고 하더라구요. 

 

저도 저만의 정의를 내려보고 싶네용~ 

좀 더 깊게 학습할 필요도 있는 개념인 것 같아요^^

댓글 영역