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 ์ฐ๊ธฐ ๊ถํ ๋ถ์ฌ |
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๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ก๋๋งต์ ๋ฐ๋ผ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
'๐ป Programming > Android Developer AtoZ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] App Components - (5) Content Provider ์๋ฒฝ ๊ฐ์ด๋ (2) | 2025.03.24 |
---|---|
[Android] App Components - (4) Broadcast Receiver ์๋ฒฝ ๊ฐ์ด๋ (0) | 2025.03.21 |
[Android] App Components (3) - Service ์๋ฒฝ ๊ฐ์ด๋ (1) | 2025.03.19 |
[Android] App Components (2) - Activity ์๋ฒฝ ๊ฐ์ด๋ (1) | 2025.03.05 |
[Android] App Components (1) - ์๋๋ก์ด๋ 4๋ ์ปดํฌ๋ํธ (0) | 2025.02.28 |