본문 바로가기

프로그래밍 일반/안드로이드

[Android] Context의 차이점을 Intent로 예제를 통해 확인하기

Context를 작성할 때에, getApplicationContext()나 this를 혼용해서 쓰는 경우가 있다. 본래의 의미를 모르고 썼다가 View관련된 부분에서 에러가 났고. 뷰를 수정하거나 할때는 Activity Context를 나머지 경우에는 Application Context를 사용하라는 팁이 있었다.

https://www.charlezz.com/?p=1080

 

안드로이드의 Context | 찰스의 안드로이드

Context는 Android 개발에 있어서 거의 모든 곳에서 이루어지며 , 가장 중요한 부분이므로 올바로 사용하려면 반드시 꼭 이해하고 넘어가야 합니다. 왜냐하면 잘못 사용하면 메모리 누수로 이어질 수 있기 때문입니다. 안드로이드에는 많은 다른 유형의 Context가 있으므로, 그것들이 무엇인지, 그것들을 사용하는 방법 그리고 언제 어떤 것을 사용 하는지를 이해합시다.

www.charlezz.com

 

안드로이드에서 자주 사용하는 startActivity(intent)가 내부적으로 어떻게 동작하는지를 통해서 그 이유를 살펴보겠다.

일단 안드로이드에서 앱을 띄운다는 것은, OS내에 있는 ActivityManagerService라는 프로세스에서 실행해주는 것이다. 즉, OS단에서 실행해주는 것이 아니라, 하나의 프로그램이 관리하는 것이다.

https://arabiannight.tistory.com/entry/272 (참고자료)

그래서 Activity를 띄운다는 것은 ActivityManagerService에서 App의 Context를 먼저 갖고 오게 되고, 이것을 ActivityContext가 자신에게 맞게 변형시키는 것이다. 이렇게 설계하는 방법을 싱글톤 디자인이라고 한다. 

 

 

만약에 내가 다른 Activity를 띄우겠다고 하면, startActivity(intent)를 통해 intent를 보낸다. 여기서 ActivityManagerService에 Context를 상속받았기 때문에 바로 요청할 수 있게 된다. 그러면 ActivityManagerService에서는 Manifest에서 확인해서 해당 앱에 맞는 이름이 있다면 해당 class를 띄워준다.

 

전체적인 상황을 적자면,

현재 상황> 화면에 B액티비티가 띄워져 있고, C액티비티가 위에 있다. B액티비티는 onPause로 쉬는상태이다.

이걸 ActivityMagerServiceActivityStack에서 보관중이다.

만약에 액티비티 내부에 특정 쓰레드를 돌린다면, B액티비티는 onPause()이여도 동작중이게 된다.

finish()를 하지 않은 이상 액티비티에 쌓이게 된다.

 

여기서 뷰를 수정하거나 할때는 Activity Context를 사용해야 하는 이유를 알 수 있다. 만약에 뷰를 ApplicationContext와 관련해서 선언했고, Activity가 finish()를 한 상황이라면, 뷰와 관련된 정보는 Application에 붙어있으므로 사라지지 않게 되는 문제를 갖게 된다. 그러므로, 생명주기와 함께할 수 있는 ActivityContext와 관련해서 선언해야 한다.