[Android] Context ๐Ÿ’ข

Jayยท2021๋…„ 1์›” 28์ผ
0

Android

๋ชฉ๋ก ๋ณด๊ธฐ
16/39
post-thumbnail
post-custom-banner

Context !?

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์— ๊ด€ํ•œ ์ „์ฒด ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค.
  • ์•กํ‹ฐ๋น„ํ‹ฐ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ, ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•  ๋–„๋„ ์‚ฌ์šฉ๋˜๊ณ  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ์—๋„ context๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๊ฑฐ๋‚˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ด€๋œ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•  ๋•Œ context๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ จ ์ •๋ณด๋ฅผ ActivityManagerService์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋ ค ํ• ๋•Œ ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•œ๋ฐ ๊ทธ ์—ญํ• ๋„ ํ•œ๋‹ค.

ContextWrapper & ContextImpl

  • Context๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋Š” ContextImpl์ด๊ณ , ์ด ๊ตฌํ˜„์ฒด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ContextWrapper๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋‹ค.

๐Ÿ“Œ ์ฐธ๊ณ  ์‚ฌํ•ญ

  • ContextImpl ํด๋ž˜์Šค๋Š” ์•ฑ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ์†Œ์Šค์ฝ”๋“œ๋กœ๋งŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์•ž์œผ๋กœ Context์˜ ๊ตฌํ˜„์ฒด๋ผ๋Š” ๋ง์€ ContextWrapper๊ฐ€ wrappingํ•˜๋Š” Context ๊ตฌํ˜„์ฒด๊ฐ€ ContextImpl์ด ์•„๋‹ ์ˆ˜ ์žˆ๊ธฐ์— ContextImpl๊ณผ์˜ ์šฉ์–ด ๊ตฌ๋ถ„์„ ์œ„ํ•ด Context ๊ตฌํ˜„์ฒด๋ผ๊ณ  ํ•œ๋‹ค.

Context ํด๋ž˜์Šค ๊ตฌ์กฐ

ContextWrapper ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž๋กœ context๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์•„์„œ context๋™์ž‘์„ context๊ตฌํ˜„์ฒด์˜ ๋™์ž‘์œผ๋กœ ์œ„์ž„ํ•œ๋‹ค. (์•„๋ž˜๋ฅผ ๋ณด์ž.)

์ฆ‰, ContextWrapper๋ฅผ ์ƒ์†ํ•˜๋Š” Activity, Service, Application๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์—์„œ ContextWrapper์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Context ๊ตฌํ˜„์ฒด์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๐Ÿ”Ž ContextWrapper๊ฐ€ Context์˜ ๊ตฌํ˜„์ฒด์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋ฅผ Proxy ํŒจํ„ด์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด Context ๊ตฌํ˜„์ฒด์™€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ ธ ์‰ฝ๊ฒŒ Context๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š ์žฅ์ ์ด ์žˆ๋‹ค.

ContextWrapper๋กœ ๊ตฌํ˜„๊ฐ€๋Šฅํ•œ ๊ฑด ์•„๋ž˜์™€ ๊ฐ™์ด ContextWrapperํด๋ž˜์Šค๋ฅผ ์—ด์–ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ContextWrapper๋Š” ์ƒ์„ฑ์ž๋กœ Context ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›๊ณ , Context์˜ ๋ชจ๋“  ๋™์ž‘์„ Context ๊ตฌํ˜„์ฒด์˜ ํ•จ์ˆ˜๋กœ ์œ„์ž„์„ ํ•œ๋‹ค.
์ด ๊ตฌ์กฐ๊ฐ€ ์ข‹์€ ์ ์€ ์•ž์„œ ๋งํ–ˆ๋“ฏ Context ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊พธ์–ด๋„ Context๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
ContextWrapper์—์„œ Context๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฉ”์„œ๋“œ๋Š” attachBaseContext(Context base)์ด๋‹ค.

ContextImpl ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ๋ณด์ž.


Context์˜ ์ข…๋ฅ˜

์œ„์˜ Context ๊ตฌ์กฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ContextWrapper๋ฅผ ์ƒ์†ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” Activity, Service, Application์ด๋‹ค.
BroadcastReceiver๋‚˜ ContentProvider๋Š” ContextWrapper๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค.
์—ฌ๊ธฐ์„œ Activity, Service, Application ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ ContextImpl์„ ์ƒ์„ฑํ•˜๊ณ  ContextWrapper์—์„œ getBaseContext()์™€ getApplicationContext()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Context๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • Application Context
    • Singleton ๊ฐ์ฒด๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์•ฑ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ์ข…๋ฃŒ์‹œ๊นŒ์ง€ ์‚ด์•„์žˆ๋‹ค.
  • Activity Context
    • Activity ์ž์ฒด๊ฐ€ Context๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๊ธฐ์— Activity ์ธ์Šคํ„ด์Šค ์ž์ฒด๊ฐ€ Context ์—ญํ• ์„ ํ•œ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ์— Activity Context๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

Context Type

  • Application
    : Singleton์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ Application Context๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ Application Context๋Š” ๋™์ผํ•œ ์•ฑ ์•ˆ์—์„œ ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • Activity / Service
    : ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ Context Instance๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • BroadcastReceiver
    : ์ž๊ธฐ ์ž์‹ ์ด Context๋Š” ์•„๋‹ˆ๋‹ค. ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค Context๋ฅผ onReceive()์˜ ์ธ์ž๋กœ ์ „๋‹ฌ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ „๋‹ฌ ๋ฐ›์€ Context์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์•กํ‹ฐ๋น„ํ‹ฐ ์ปจํ…์ŠคํŠธ๋กœ ๋ธŒ๋กœ๋“œ ์บ์ŠคํŠธ ์‹คํ–‰ ์‹œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ธŒ๋กœ๋“œ ์บ์ŠคํŠธ๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋œ๋‹ค.

  • ContentProvider
    : ์ž๊ธฐ ์ž์‹ ์ด Context๋Š” ์•„๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํ˜ธ์ถœ ์‹œ ๋™์ผํ•œ Singleton Context ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํ˜ธ์ถœ ์‹œ ๋‹ค๋ฅธ Context ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


Context ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ• โœ…

  • ActivityName.this

    • Activty Context๋ฅผ ๋ฐ˜ํ™˜.
    • Activity Scope์•ˆ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” this๋งŒ์œผ๋กœ๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    • Activity์˜ inner class์™€ ๊ฐ™์ด Activity Scope๋ฅผ ๋ฒ—์–ด๋‚œ ๊ณณ์—์„œ Activity Instance๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ ActivityName.this๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • getApplicationContext()

    • Application Context๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • getApplication()

    • Application ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • Application๋„ Context์˜ ์ž์‹ ํด๋ž˜์Šค์ž„์œผ๋กœ Context์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, Application๊ณผ ApplicationContext๊ฐ€ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ผ๋Š” ๋ณด์žฅ์ด ์—†๊ณ , Application์€ Activity๋‚˜ Service๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ฐจ์ด๋„ ์žˆ๋‹ค.
  • getBaseContext()

    • ContextWrapper์˜ Context ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๋‹ค๋ฅธ Context๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ContextWrapper ์•ˆ์— ์žˆ๋Š” context๋ฅผ getBaseContext()๋กœ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ด๋Š” Activity Context์˜ ์ผ์ข…์ด๋‹ค.
  • View์—์„œ getContext()

    • View์—์„œ๋„ getContext()๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์„œ Context๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, View๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” Context๊ฐ€ getContext()์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ View๊ฐ€ ์†ํ•ด์žˆ๋Š” Activity์˜ Context๊ฐ€ ํ•ด๋‹น View์˜ Context๊ฐ€ ๋œ๋‹ค.

Context์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ์— Activity์™€ ๋ถ„๋ฆฌ๋œ ์ž‘์—…์— Activity Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ Activity์— ์ข…์†๋œ ์ž‘์—…์„ Application Context๋ฅผ ์ด์šฉํ•˜๋ฉด Activity๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ Context๋ฅผ ์ด์šฉํ•œ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„(๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„์„œ) ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โš ๏ธ ๊ทธ๋ ‡๊ธฐ์— Context์˜ ํŠน์ง•๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด ์•Œ๋งž๊ฒŒ ์จ์•ผ ํ•œ๋‹ค.

profile
developer
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€