๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Android Developer AtoZ

[Android] App Components - (6) Intent ์™„๋ฒฝ ๊ฐ€์ด๋“œ

by ๊ธฐ๋ฌด์ • 2025. 3. 24.
728x90

 

 

 

Android์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ Intent๋Š” ์•ฑ ๋‚ด ๋˜๋Š” ๋‹ค๋ฅธ ์•ฑ๊ณผ์˜ ๋ฐ์ดํ„ฐ ๋ฐ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๋ช…์‹œ์  ๋ฐ ์•”์‹œ์  ์ธํ…ํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

Intent

Intent๋Š” Android์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. Activity, Service, Broadcast Receiver ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์•ฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Intent์—๋Š” ๋ช…์‹œ์  ์ธํ…ํŠธ, ์•”์‹œ์  ์ธํ…ํŠธ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Explict Intents (๋ช…์‹œ์  ์ธํ…ํŠธ)

๋ช…์‹œ์  ์ธํ…ํŠธ๋Š” ์ธํ…ํŠธ์˜ ๋ชฉ์ ์ง€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์•ฑ ๋‚ด๋ถ€์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

val intent = Intent(this@MainActivity, SecondActivity::class.java)
startActivity(intent)

์œ„ ์ฝ”๋“œ์—์„œ SecondActivity๋ผ๋Š” ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

Implicit Intents (์•”์‹œ์  ์ธํ…ํŠธ)

์•”์‹œ์  ์ธํ…ํŠธ๋Š” ์ธํ…ํŠธ์˜ ๋ชฉ์ ์ง€๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ์‹œ์Šคํ…œ์ด ์ ํ•ฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ธํ…ํŠธ๋ฅผ ๋ฐœ์†กํ•  ๋•Œ ํ•„์š”ํ•œ Action์ด๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ํ•ฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์ด ์—ฌ๋Ÿฌ ์•ฑ ์ค‘์—์„œ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์•ฑ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"
intent/putExtra(Intent.EXTRA_TEXT, "Hello World!")
startActivity(Intent.createChooser(intent, "Send via"))

 

์˜ˆ์‹œ์—์„œ Intent.ACTION_SEND ๋ผ๋Š” ์ž‘์—…์„ ์ง€์ •ํ–ˆ์ง€๋งŒ, ์–ด๋–ค ์•ฑ์—์„œ ์ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ• ์ง€๋Š” ์‹œ์Šคํ…œ์ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ "Send via" ์„ ํƒ์ง€์—์„œ ์ด๋ฉ”์ผ, ๋ฉ”์‹ ์ € ๋“ฑ ์—ฌ๋Ÿฌ ์•ฑ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Intent Filter

Intent Filter๋Š” Android ์‹œ์Šคํ…œ์ด ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.

AndroidManifest.xml์—์„œ intent-filter๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น Activity ๋˜๋Š” Service๊ฐ€ ํŠน์ • Action, Category, Data๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

<activity android:name=".WebActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="https"/>
    </intent-filter>
</activity>

 

 

Intent ์ถ”๊ฐ€ ์†์„ฑ

Extra

Intent๋Š” putExtra() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val intent = Intent(context, DetailActivity::class.java)
intent.putExtra("username", "JohnDoe")
startActivity(intent)
val username = intent.getStringExtra("username")

 

 

Query Parameters (URI Query)

URI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น URL์—์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com?user=JohnDoe&age=25"))
startActivity(intent)
val uri: Uri? = intent.data
val user = uri?.getQueryParameter("user") ?: "Unknown"
val age = uri?.getQueryParameter("age")?.toInt() ?: 0

 

 

Bundle

Bundle์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val bundle = Bundle()
bundle.putString("username", "JohnDoe")
bundle.putInt("age", 25)

val intent = Intent(context, DetailActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)

 

val extras = intent.extras
val username = extras?.getString("username")
val age = extras?.getInt("age")

 

 

Pacelable

๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Pacelable๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Parcelize
data class User(val id: Int, val name: String) : Parcelable
val user = User(1, "Alice")
intent.putExtra("user_data", user)
val user = intent.getParcelableExtra<User>("user_data")

 

๐Ÿ’ก ์ฐธ๊ณ 
Bundle๊ณผ Pacelable์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‹ค์Œ ๊ธ€์„ ์ฐธ๊ณ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
[Android] App Components - (2) Activity ์™„๋ฒฝ ๊ฐ€์ด๋“œ

 

 

Flags

Flags๋Š” Intent์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด Activity๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ธฐ์กด์˜ Activity๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๊ฑฐ๋‚˜, ๋ฐฑ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val intent = Intent(this, SecondActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)

 

์ฃผ์š” Intent Flags ๋ชฉ๋ก์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Flag ์„ค๋ช…
FLAG_ACTIVITY_NEW_TASK ์ƒˆ Task์—์„œ Activity๋ฅผ ์‹คํ–‰
FLAG_ACTIVITY_SINGLE_TOP ํ˜„์žฌ ํ™”๋ฉด๊ณผ ๊ฐ™์€ Activity๊ฐ€ ์Šคํƒ ์ตœ์ƒ์œ„์— ์žˆ์œผ๋ฉด ์žฌ์‚ฌ์šฉ
FLAG_ACTIVITY_CLEAN_TOP ๋™์ผํ•œ Activity๊ฐ€ ์Šคํƒ์— ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น Activity ์œ„์˜ ๋ชจ๋“  Activity ์ œ๊ฑฐ ํ›„ ์‹คํ–‰
FLAG_ACTIVITY_REORDER_TO_FRONT ๋™์ผํ•œ Activity๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋‹ค์‹œ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ด (์žฌ์‚ฌ์šฉ)
FLAG_ACTIVITY_NO_HISTORY Activity๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๋ฉด ์ฆ‰์‹œ ์ œ๊ฑฐ
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS ์ตœ๊ทผ ์•ฑ ๋ชฉ๋ก์—์„œ ์ด Activity๋ฅผ ์ œ์™ธ
FLAG_ACTIVITY_CLEAR_TASK ๊ฐ€์กด Task์˜ ๋ชจ๋“  Activity๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ ์‹œ์ž‘
FLAG_ACTIVITY_MULTIPLE_TASK ๊ธฐ์กด Task๊ฐ€ ์žˆ๋”๋ผ๋„ ์ƒˆ๋กœ์šด Task๋ฅผ ์ƒ์„ฑ (์ผ๋ฐ˜ ์•ฑ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ)
FLAG_GRANT_READ_URI_PERMISSION ContentProvider์—์„œ URI ์ฝ๊ธฐ ๊ถŒํ•œ ๋ถ€์—ฌ
FLAG_GRANT_WRITE_URI_PERMISSION ContentProvider์—์„œ URI ์“ฐ๊ธฐ ๊ถŒํ•œ ๋ถ€์—ฌ

 

728x90

 

 

Intent ์‹คํ–‰

startActivity() - ์ƒˆ๋กœ์šด ํ™”๋ฉด ์‹œ์ž‘

Activity ๊ฐ„ ํ™”๋ฉด ์ „ํ™˜ ์‹œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

val intent = Intent(context, DetailActivity::class.java)
startActivity(intent)

 

startActivityForResult() - ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ ์š”์ฒญ

๋‹ค๋ฅธ Activity์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

val intent = Intent(context, SelectImageActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val imageUri = data?.data
    }
}

 

sendBroadcast() - ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ „์†ก

Broadcast Receiver๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

val intent = Intent("com.example.CUSTOM_BROADCAST")
sendBroadcast(intent)

 

startService() / bindService() - ์„œ๋น„์Šค ์‹œ์ž‘

์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

val intent = Intent(context, MyService::class.java)
context.startService(intent)

 


 

Intent๋Š” Android์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์›ํ™œํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›ํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ธํ…ํŠธ ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ธํ…ํŠธ ์œ ํ˜•์„ ํ™œ์šฉํ•ด ์•ฑ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์ ์ ˆํ•œ Intent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 


 

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๋กœ๋“œ๋งต์„ ๋”ฐ๋ผ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

 

 

728x90