2024. 3. 31. 18:34, ๐ฑAndroid Study
๋ฐ์ํ
์ธํ ํธ (Intent)
- ์ธํ ํธ(Intent)๋ ์ผ์ข ์ ๋ฉ์์ง ๊ฐ์ฒด
- ์ธํ ํธ๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ ์ฑ ๊ตฌ์ฑ์์(์กํฐ๋นํฐ, ์๋น์ค, ๋ธ๋ก๋ ์บ์คํธ๋ฆฌ์๋ฒ)๋ก ์์ ์ ์์ฒญ
์ธํ ํธ ์ ํ
1) ๋ช ์์ ์ธํ ํธ(Explicit Intent)
- ํน์ ํ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์ ์ผ๋ก ํธ์ถํ ๋ ์ฌ์ฉ๋๋ ์ธํ ํธ
- ๊ฐ๋ฐ์๋ ์ธํ
ํธ ๊ฐ์ฒด์ ์์ํ๊ณ ์ ํ๋ ๊ตฌ์ฑ ์์์ ์ด๋ฆ์ ๋ช
ํํ๊ฒ ์ค์ ํ๊ณ
startActivity() ๋๋ startService() ๋ฉ์๋๋ฅผ ํตํด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์คํ - ์ฃผ๋ก ์ฑ ๋ด๋ถ์์ ๋ค๋ฅธ ์กํฐ๋นํฐ๋ ์๋น์ค๋ฅผ ์์ํ ๋ ์ฌ์ฉ
(์) ๋ฉ์ธ ์กํฐ๋นํฐ์์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ํ๋ ์๋ก์ด ์กํฐ๋นํฐ๋ฅผ ๋์ธ ๋
2) ์์์ ์ธํ ํธ(Implicit Intent)
- ๋ช ์์ ์ผ๋ก ํน์ ํ ์ปดํฌ๋ํธ(์: ์กํฐ๋นํฐ, ์๋น์ค, ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ)๋ฅผ ์ง์ ํ์ง ์๊ณ , ์์คํ ์ ์ด๋ค ์์ ์ ์ํํ ๊ฒ์ธ์ง ์๋ ค์ฃผ๋ ์ธํ ํธ (์ํํ๊ณ ์ ํ๋ ์ผ๋ฐ ์์ ์ ์ธํ ํธ ๊ฐ์ฒด์ ์ค์ ํ์ฌ startActivity() ๋ฉ์๋์ ๋๊น)
- ๋ชฉ์ ์ง ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ๋ ๋์ , ์์ ์ ๋ํ ์ก์ (action)๊ณผ ํ์ํ ๋ฐ์ดํฐ(๋ฐ์ดํฐ URI, MIME ํ์ ๋ฑ)๋ฅผ ์ง์
- ์์คํ ์ ์ด ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์์ ์ ์ํํ ์ ์๋ ์ฑ(์ ํฉํ ์ธํ ํธ ํํฐ๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ)๋ค์ ์ฐพ์ ์ฌ์ฉ์์๊ฒ ์ ํํ ์ ์๋ ํ๋ฉด์ ํ์
- ์ธํ
ํธ ํํฐ
- ์ธํ ํธ ํํฐ๋ ํน์ ์ธํ ํธ์ ๋ฐ์ํ๋ ์กํฐ๋นํฐ, ์๋น์ค ๋๋ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ์ ๋ฅ๋ ฅ์ ์ ์
- ์ด๋ค ์ธํ ํธ๋ฅผ ์์ ํ ์ค๋น๊ฐ ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ค์ - ์ฃผ๋ก ๋ค๋ฅธ ์ฑ์ ์ปดํฌ๋ํธ๋ฅผ ์คํ์ํค๋ ๋ฐ ์ฌ์ฉ
(์) ์ฌ์ฉ์๊ฐ '์ง๋ ๋ณด๊ธฐ'๋ฅผ ์์ฒญํ ๋, ํด๋น ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ชจ๋ ์ฑ ์ค ์ฌ์ฉ์๊ฐ ์ ํํ ์ ์๋๋ก ์๋๋ก์ด๋ ์์คํ ์ด ๋ชฉ๋ก์ ์ ๊ณต
์ธํ ํธ ๊ฐ์ฒด ๋ถ์
1) ์ปดํฌ๋ํธ ์ด๋ฆ (Component Name)
- new Intent(context, TargetActivity.class) ์์ TargetActivity.class
- ํ๊ฒ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ๋ช ์ํ์ฌ, ์ธํ ํธ๊ฐ ์ ๋ฌ๋ ์ ํํ ๋์์ ์ง์
- ์ปดํฌ๋ํธ ์ด๋ฆ์ด ์์ผ๋ฉด, ์ธํ ํธ๋ ์์์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ณ , ์์คํ ์ด ์ ์ ํ ๋์์ ์ฐพ์
2) ์ก์ (Action)
- ์ธํ ํธ๊ฐ ์ํํด์ผ ํ ์ผ๋ฐ์ ์ธ ์์ ์ ์ ์
- (์) Intent.ACTION_VIEW๋ ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค ๋ ์ฌ์ฉ
Intent.ACTION_DIAL์ ์ ํ ๋ค์ด์ผ์ ์ด๊ธฐ ์ํด ์ฌ์ฉ
3) ๋ฐ์ดํฐ (Data)
- ์์ ์ ์ํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ์ URI๋ฅผ ์ง์
- ๋ฐ์ดํฐ๋ ๋ณดํต 'Uri' ๊ฐ์ฒด๋ก ์ก์ ๊ณผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉ
- (์) Uri.parse("tel:12345")๋ ์ ํ ์ฑ์ ์ ํ๋ฒํธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต
4) ์นดํ ๊ณ ๋ฆฌ (Category)
- ์ธํ ํธ์ ์ ํ์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ์ฌ, ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ฒ๋ฆฌํ ์ ์๋์ง ์๋ ค์ค
- (์) Intent.CATEGORY_HOME์ ํ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ์ฌ์ฉ
5) ์์คํธ๋ผ (Extras)
- ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ธํ ํธ์ ์ ๋ฌํ๊ธฐ ์ํ ํค-๊ฐ ์์ ์ถ๊ฐ ์ ๋ณด
- ์์คํธ๋ผ๋ฅผ ํตํด ๊ธฐ๋ณธ ํ์ ๋ถํฐ Serializable ๊ฐ์ฒด๊น์ง ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- (์) intent.putExtra("extra_key", "value") : "extra_key"๋ ์ ๋ฌํ ๋ฐ์ดํฐ์ ํค, "value"๋ ์ค์ ๊ฐ
๋ช ์์ ์ธํ ํธ๋ก ๋ค๋ฅธ ์กํฐ๋นํฐ ์์
val intent = Intent(this, AnotherActivity::class.java)
// ํ์ฌ ์กํฐ๋นํฐ์์ AnotherActivity๋ฅผ ์์ํ๊ธฐ ์ํ ๋ช
์์ ์ธํ
ํธ ์์ฑ
intent.putExtra("key", "value")
// ์ธํ
ํธ์ ๋ฐ์ดํฐ ์ถ๊ฐ (์ต์
)
startActivity(intent)
// AnotherActivity ์์
- ๋ช ์์ ์ธํ ํธ(Explicit Intent)๋ ํน์ ํ ์กํฐ๋นํฐ๋ฅผ ์์ํ ๋ ์ฌ์ฉ (ํ์ฌ ์กํฐ๋นํฐ์์ ๋ค๋ฅธ ์กํฐ๋นํฐ๋ก ์ ํ)
- 1. ์ธํ
ํธ ์์ฑ
- Intent ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ํ์ฌ ์ปจํ ์คํธ(this)๋ฅผ, ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์์ํ๊ณ ์ ํ๋ ์กํฐ๋นํฐ์ class ๊ฐ์ฒด๋ฅผ ์ ๋ฌ
- ์ธํ ํธ๋ฅผ ์์ฑํ ๋ ::class.java๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋๋ก์ด๋ ํ๋ ์์ํฌ์ ์๊ตฌ์ฌํญ ๋๋ฌธ์ด๋ค. ์๋๋ก์ด๋์์๋ ์กํฐ๋นํฐ๋ฅผ ์ง์ ํ ๋ Java์ .class ํํ์์ด ํ์ํ๋ฐ, Kotlin์ Java์ ํธํ๋๊ธฐ ๋๋ฌธ์ ::class.java๋ฅผ ์ฌ์ฉํ์ฌ ์กํฐ๋นํฐ์ ํด๋์ค ๋ฐํ์ ํํ์ ์ป๋๋ค. - (์ ํ) 2. ๋ฐ์ดํฐ ์ ๋ฌ
- putExtra() ๋ฅผ ์ฌ์ฉํ์ฌ ์ธํ ํธ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ์ ์์
- ํค-๊ฐ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์์๋ ์กํฐ๋นํฐ์์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ - 3. ์กํฐ๋นํฐ ์์
- startActivity ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ธํ ํธ๋ฅผ ์ฌ์ฉ
- ์ด ํธ์ถ์ด ์คํ๋๋ฉด ์๋๋ก์ด๋ ์์คํ ์ ๋ช ์๋ ์ธํ ํธ์ ๋ฐ๋ผ AnotherActivity๋ฅผ ์์
๐ก์ฌ์ฉ ์์
FirstActivity.kt
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first)
val btn = findViewById<Button>(R.id.buttonFirstActivity)
btn.setOnClickListener{
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent) // ๋ช
์์ ์ธํ
ํธ๋ก SecondActivity๋ก ๋๊ธฐ๋ ๋ฒํผ ์ค์
}
}
}
SecondActivity.kt
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val btn = findViewById<Button>(R.id.buttonSecondActivity)
btn.setOnClickListener{
finish() // SecondActivity ์์ ๋ฒํผ์ด ํด๋ฆญ๋๋ฉด finish() ๋ฉ์๋๋ก ํ์ฌ ์กํฐ๋นํฐ ์ข
๋ฃ
}
}
}
์์์ ์ธํ ํธ๋ก ๋ค๋ฅธ ์กํฐ๋นํฐ ์์
- ์ธํ ํธ ์์ ์์ ์ ๋ํ ์ก์ (action)๊ณผ ํ์ํ ๋ฐ์ดํฐ(๋ฐ์ดํฐ URI, MIME ํ์ ๋ฑ)๋ฅผ ์ง์
- (์) 114 ๋ฒํธ๋ก ๋ค์ด์ผ ์์
์ ์ํํ ์ ์๋ ์กํฐ๋นํฐ๋ฅผ ์คํํ๊ธฐ ์ํด์๋
val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
startActivity(call_intent)
๋ค์๊ณผ ๊ฐ์ด ์ธํ ํธ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ startActivity() ๋ฉ์๋์ ์ ๋ฌ
๐ก์ฌ์ฉ ์์
activity_first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...>
<TextView
... />
<Button
... />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="๋ค์ด์ผ ์์
์์ํ๊ธฐ"
android:id="@+id/buttonDialActivity"
android:onClick="doOnBtnClick" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="์ง๋๋ณด๊ธฐ ์์
์์ํ๊ธฐ"
android:id="@+id/buttonMapActivity"
android:onClick="doOnBtnClick" />
</LinearLayout>
FirstActivity.kt
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
}
// ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ
// @param view : ํด๋ฆญ๋ ๋ฒํผ ๊ฐ์ฒด
// ํด๋ฆญ๋ ๋ฒํผ ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ์ง๋ฅผ id๋ฅผ ํตํด ์ธ์งํ์ฌ, ๋ ๊ฐ์ง ๋ค๋ฅธ ์ธํ
ํธ ๊ฐ์ฒด๋ฅผ ์์ฑ
fun doOnBtnClick(view: View) {
when (view.getId()) {
R.id.buttonDialActivity -> { // 114 ์ ํ๋ฒํธ๋ก ๋ค์ด์ผ ์์
์ ์ํํ ์ ์๋๋ก ์ค์
val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
startActivity(call_intent)
}
R.id.buttonMapActivity -> { // ์ฃผ์ด์ง ์๋,๊ฒฝ๋ ์์น๋ก ์ง๋๋ฅผ ๋ณด์ฌ์ค ์ ์๋๋ก ์ค์
val map_intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.565350, 127.01445"))
startActivity(map_intent)
}
}
}
}
์์์ ์ธํ ํธ ์์ (์ธํ ํธ ํํฐ)
AndroidManifest.xml
<activity android:name=".MainActivity">
<intent-filter> // ์กํฐ๋นํฐ ์์ ์ธํ
ํธ ํํฐ ์ถ๊ฐ
<action android:name="android.intent.action.DIAL" /> // ๋ค์ด์ผ์ ํ ์ ์๋ ์ฑ์ ์ ํ
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
</activity>
MainActivity๊ฐ ACTION_VIEW ์ก์
์ ์ฒ๋ฆฌํ ์ ์์
๋ํ, http ์คํค๋ง๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์์ ์ง์
- ์ธํ
ํธ ํํฐ(Intent Filter)
- ์๋๋ก์ด๋ ์ฑ์ด ํน์ ํ ์ก์ (action)์ด๋ ๋ฐ์ดํฐ ์ ํ์ ์ฒ๋ฆฌํ ์ ์๋์ง ์์คํ ์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ
- ๋ค์ ๋งํด, ์ฑ์ด ๋ค๋ฅธ ์ฑ์ผ๋ก๋ถํฐ ์ค๋ ์์์ ์ธํ ํธ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋์๋์ง๋ฅผ ๋ํ๋
- AndroidManifest.xml ํ์ผ์ ์ ์ธ
- <intent-filter> ์์๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฑ์ด ์์ ํ ์ ์๋ ์ธํ ํธ ์ ํ์ ์ง์ (action, data, category ๋ฑ)
- ๋ค๋ฅธ ์ฑ์ด ๋ณด๋ธ ์ธํ ํธ๋ฅผ ํด๋น ์ฑ์ด ์์ ํ ์ ์๋๋ก ์ค์ - ์ธํ ํธ ํํฐ๋ฅผ ์ ์ธํ๋ฉด ํด๋น ์ฑ์ด ํน์ ์ก์ ์ ์๋ตํ ์ ์๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ํ์ด์ง๋ฅผ ์ด๊ธฐ ์ํ ์ธํ ํธ๋ฅผ ์์ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ํด๋น ์ก์ (ACTION_VIEW)์ ์ ์ธํ๊ณ ํด๋น ๋ฐ์ดํฐ ์ ํ(data)์ ์ง์ ํ ์ ์๋ค.
- ๊ฐ ์ธํ ํธ ํํฐ๊ฐ ์ธํ ํธ์ ์์ , ๋ฐ์ดํฐ ๋ฐ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ด๋ ์ ํ์ ์ธํ ํธ๋ฅผ ์์ ํ ์ง ๊ฒฐ์
์กํฐ๋นํฐ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ
- ์ธํ ํธ์ ์ปดํฌ๋ํธ ์คํ์ ์์ฒญํ ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ๋ฌํ๋ ค๋ฉด ์์คํธ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉ
- ์์คํธ๋ผ ๋ฐ์ดํฐ = ์ธํ ํธ์ ๋ด๋ ๋ถ๊ฐ ์ ๋ณด
- Extras๋ฅผ ํ์ฉํ์ฌ ์ด๋ฆ๊ณผ ๊ฐ์ ์์ผ๋ก๋ ์ ๋ณด๋ฅผ ์ ๋ฌ
Extras์ ๊ฐ์ ์ ์ฅํ๋ ๋ฉ์๋ :: putExtra()
- Intent putExtra("String name", int value)
- Intent putExtra("String name", String value)
- Intent putExtra("String name", boolean value)
Extras์ ์ ์ฅ๋ ๊ฐ์ ์ฝ๋ ๋ฉ์๋ :: get~Extra()
- int getIntExtra(String name, int defaultValue)
- string getStringExtra(String name)
- boolean getBooleanExtra(String name, boolean defaultValue)
๐ก์ฌ์ฉ ์์
FirstActivity.kt
..
val btn_call3 = findViewById<Button>(R.id.buttonThirdActivity)
btn_call3.setOnClickListener {
val edit_text = findViewById<EditText>(R.id.edit_data)
val strData = edit_text.text.toString()
val intent = Intent(this, ThirdActivity::class.java)
intent.putExtra("dataFromFirstActivity",strData) // putExtra() ์ฌ์ฉ
startActivity(intent)
}
..
ThridActivity
..
val strData = intent.getStringExtra("dataFromFirstActivity") //get~Extra() ์ฌ์ฉ
val editText = findViewById<EditText>(R.id.editText)
editText.setText(strData)
val btn_close = findViewById<Button>(R.id.buttonThirdActivity)
btn_close.setOnClickListener{
finish() // Finish๋ก ์ด์ ์กํฐ๋นํฐ์ ๋ค์ ๋์๊ฐ
}
..
๋ฐ์ํ
๐ฌ C O M M E N T