오늘도 배우자!

귀찮음에 배움을 멀리하지 않기를...

Develop/Android

Context 탐구

리다양 2016. 12. 28. 17:35
1. Context란? 

 Application의 상태를 포함하고있는 정보의 접근을 제공하는 것 



2. 언제 Context를 사용하는가? 


 1) 현재 개발 중인 Application 내의 Component를 '명시적'으로 실행하는 경우 


예를 들어, 흔히 우리가 현재화면에서 다음화면으로 넘어갈 때 Intent를 사용하는데 그때 사용하는 것이 Context이다.


         


요것이 왜 중요하냐면... 우리가 어플 내에서 '명시적'으로 Component를 호출할 때 필요한 것이 있는데

고것에 대한 정보를 Context가 제공해준다.


여기서 어떤것이 필요할까?? 궁금증이 생길텐데 필요한것은 다음과 같다.


해당 Component가 어느 패키지에 포함되어 있는지 알려주는 Package Name과 해당 구성요소의 Java class의 풀네임이다.

위의 코드를 참고해 설명을 하겠다.

실제로 NextActivity.class 라는 녀석은 com.example.yangsiyoung.myapplication.activity.NextActivity라는

긴 이름을 가지고있다. 이것이 무엇이냐면 한마디로 경로라고보면 쉽다.

내가 현재 개발중인 어플리케이션 이름이 myapplication이고 그 속에 Activity를 따로 모으기위해 따로 내가 만들어둔

activity라는 package속에 들어있는 NextActivity라는 뜻이다.


실제로 이렇게 일일이 이녀석의 신원을 파악하기 번거롭기도하고 귀찮으니, 이렇게 정보를 모두 담고있는

Context라는 녀석을 활용해서 번거로움을 덜어주는 것 이다.


정리하자면, Application 내의 Component를 실행하면 context.getPackageName()을 사용하여

해당 Component의 Package Name를 얻을 수 있기에 Context가 넘겨지게 되는 것이다.


2) View를 생성할 때


우리가 개발하면서 수많은 View를 생성했지만 그 View가 어떤 것을 필요로하는지 생각해 본 사람은 드물것이다.

나도... 그냥... 코드만 치면 나오는걸로 생각했지만... 실제로는 다음과 같은것들이 필요하다.


첫번째, App이 실행되는 기기의 스크린 크기와 치수이다. 이를 통해 우리가 정의해둔 dp,sp가 pixel로 변환되어 표시된다.


두번째, 스타일 속성


세번째, OnClick등의 행동에 대한 Activity Reference이다.


요것들을 Context가 알아서 제공해준다는 사실... 이해만 해두자..복잡... 어렵.... 하기싫...


3) XML Layout file을 적용할 때(Inflate할때다아!!!)


우리가 흔히 ListView나 RecyclerView를 활용하는 등 Adapter를 쓸때 LayoutInflater를 자주 사용했을 것이다.

그 LayoutInflater를 쓸 때 XML Layout에 정의해두었던 그림을 가져와서 쓰는 부분이있다.

그때 XML Layout을 java코드를 통해 연동할때도 Context가 도와준다... 거의 자원봉사수준...



4) Broadcast를 보낼 때(어플 내)


우리가 LocalBroadcastManager를 통해 Broadcast를 보낼 때나 Broadcast를 수신할 때 사용한다.

그런데 보통 우리는 BroadcastReceiver를 manifest 파일에 인텐트 필터를 등록해서 사용하므로 참고만 해두자...


5) Notification 사용시

요거는 나중에 푸시알림 서비스에 관해 설명할때 이야기하도록 할게요... 복잡...



3. Application Context와 Activity Context의 차이


어플 개발을 하다보면 필수적으로 어플의 테마를 건드리게 되는데 이것은 해당 Application 전반적인

부분에 적용을 하기 위한것이다. 그리고 전체 테마를 설정 후 Activity 별로 또 다르게 테마를 설정하기도한다.

ex) 어떤 Activity는 타이틀 바가 없고, 어떤 Activity는 ActionBar가 없고 등등...


이렇게만봐도 어플 전반적인 부분을 다루는거랑 Activity 하나하나만 다르게하는거랑 조금 느낌이 다른걸 알수있는데

요게 Lifecycle과 관계 되어있다.


가령 우리가 Toast를 통해 메시지를 띄운다고 가정하자 다음과 같이 작성이 가능하다.

여기서 차이점은 Application Context를 사용하였느냐, Activity Context를 사용하였느냐인데

둘다 문제 없이 코드가 정상 작동한다.


하지만 Application Context는 Application의 Lifecycle을 Activity Context는 Activity의 Lifecycle을 따라간다는 점에 유의하자.


즉, 메모리 관리를 위해 정말 필요한 경우가 아니면 Activity Context를 사용하라는 것이다.

실제로도 우리가 프로그래밍하는 대부분의 경우 Activity Context로 처리할 수 있는 경우가 대부분이니

좀 더 현명한 개발자가 되기 위해서 기본에 충실하자는 것이 나의 느낀점이다...



4. 결론


Context는 Application의 전반적인 내용을 포함하고 있는 녀석이다.


- 참고 => Code path = https://guides.codepath.com/android/Using-Context#sending-a-local-broadcast