λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Android Studio

[Android μ•±κ°œλ°œ μž…λ¬Έ] Intent (# μΆ”κ°€ν•˜κΈ°)

by μ Όμ Ό39 2024. 3. 20.

Intent

    : μΌμ’…μ˜ λ©”μ‹œμ§€ 객체

    - 이것을 μ΄μš©ν•΄ λ‹€λ₯Έ μ•± κ΅¬μ„±μš”μ†Œ(μ•‘ν‹°λΉ„ν‹°, μ„œλΉ„μŠ€, λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„)둜 μž‘μ—…μ„ μš”μ²­ν•  수 있음
            - startActivity(intent), startService(intent), sendBroadcast(intent)

    - μ•ˆλ“œλ‘œμ΄λ“œ μ•±μ˜ ꡬ성 μš”μ†Œλ“€ μ‚¬μ΄μ—μ„œ 싀행을 μœ„μž„ν•˜κ±°λ‚˜ 정보λ₯Ό μ „λ‹¬ν•˜λŠ” 역할을 함

 

1. Intent의 μœ ν˜•

1) λͺ…μ‹œμ  μΈν…νŠΈ (explicit intent)

     : νŠΉμ •ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ§μ ‘μ μœΌλ‘œ ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ˜λŠ” μΈν…νŠΈ

    - 이 λ°©λ²•μœΌλ‘œ κ°œλ°œμžλŠ” μΈν…νŠΈ 객체에 μ‹œμž‘ν•˜κ³ μž ν•˜λŠ” ꡬ성 μš”μ†Œμ˜ 이름을 λͺ…ν™•ν•˜κ²Œ μ„€μ •ν•˜κ³ ,
        startActivity() λ˜λŠ” startService() λ©”μ†Œλ“œλ₯Ό 톡해 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‹€ν–‰μ‹œν‚΄
         (μ‹œμŠ€ν…œμ΄ μ•‘ν‹°λΉ„ν‹° μΆ”λ‘ ν•  ν•„μš” 없이 κ°œλ°œμžκ°€ 직접 μ§€μ •)

        //주둜 μ•± λ‚΄λΆ€μ—μ„œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹°λ‚˜ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•  λ•Œ μ‚¬μš©λ¨. 
        (ex. 메인 μ•‘ν‹°λΉ„ν‹°μ—μ„œ μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ μ„ΈλΆ€ 정보λ₯Ό ν‘œμ‹œν•˜λŠ” μƒˆλ‘œμš΄ μ•‘ν‹°λΉ„ν‹°λ₯Ό λ„μšΈ λ•Œ)

 

2) μ•”μ‹œμ  μΈν…νŠΈ

    : νŠΉμ •ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šκ³ ,
        μˆ˜ν–‰ν•˜κ³ μž ν•˜λŠ” 일반적인 μž‘μ—…μ„ μΈν…νŠΈ 객체에 μ„€μ •ν•΄ startActivity() λ©”μ†Œλ“œμ— λ„˜κΉ€

    - μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œμ€ 이 μΈν…νŠΈλ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 검색해
        μ ν•©ν•œ μΈν…νŠΈ ν•„ν„°λ₯Ό κ°€μ§„ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ°Ύμ•„ μ‹€ν–‰μ‹œν‚΄

    (1) μΈν…νŠΈ ν•„ν„°
            : νŠΉμ • μΈν…νŠΈμ— λ°˜μ‘ν•˜λŠ” μ•‘ν‹°λΉ„ν‹°, μ„œλΉ„μŠ€ λ˜λŠ” λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„μ˜ λŠ₯λ ₯을 μ •μ˜
            = μ–΄λ–€ μΈν…νŠΈλ₯Ό μˆ˜μ‹ ν•  μ€€λΉ„κ°€ λ˜μ–΄μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„€μ •

        - 본인의 앱이 μˆ˜μ‹ ν•  수 μžˆλŠ” μ•”μ‹œμ  μΈν…νŠΈκ°€ 무엇인지 μ•ŒκΈ° μœ„ν•΄μ„œλŠ”
            각 μ•± ꡬ성 μš”μ†Œμ— λŒ€ν•œ ν•˜λ‚˜ μ΄μƒμ˜ μΈν…νŠΈ ν•„ν„°λ₯Ό <intent_filter> μš”μ†Œλ‘œ λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ— μ„ μ–Έν•΄μ•Ό 함

        - 각 μΈν…νŠΈ ν•„ν„°κ°€ μΈν…νŠΈμ˜ μž‘μ—…, 데이터 및 μΉ΄ν…Œκ³ λ¦¬λ₯Ό 근거둜 μ–΄λŠ μœ ν˜•μ˜ μΈν…νŠΈλ₯Ό μˆ˜μ‹ ν• μ§€λ₯Ό 결정함

        // AndroidManifest.xml μ—μ„œ android:name 속성 값이 SecondActivity인 <activity>μš”μ†Œ ν•˜μœ„μ— <intent-filter> νƒœκ·Έ μΆ”κ°€

        <activity
            android:name=".SecondActivity"
            android:label="Second Activity"
            android:exported="false" >

            <intent-filter>
                <action android:name="android.intent.action.DIAL"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="tel"/>
            </intent-filter>

        </activity>

        // action의 action.DIAL : 닀이얼을 받을 수 μžˆλŠ” μ•±
        // data -> λ°μ΄ν„°λŠ” tel을 톡해 λ°›μ„κ²ƒμž„

        // android:name = μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œμ—μ„œ ν•΄λ‹Ή ꡬ성 μš”μ†Œλ₯Ό μ°Ύμ•„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©. (ꡬ성 μš”μ†Œμ˜ μ‹€μ œ κ΅¬ν˜„λœ 클래슀 이름)

        // android:label = μ•±μ˜ 화면에 ν‘œμ‹œλ˜λŠ” ν…μŠ€νŠΈ. μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ—μ„œ ν•΄λ‹Ή ꡬ성 μš”μ†Œλ₯Ό 식별할 λ•Œ μ‚¬μš©

<action> μˆ˜μ‹ λ˜λŠ” μΈν…νŠΈμ˜ μ•‘μ…˜μ„ μ§€μ •
(μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œλŠ” μ•‘μ…˜μ— 따라 μ‹œμŠ€ν…œμ΄ μ–΄λ–€ λ™μž‘μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό κ²°μ •)
//ex. android.intent.action.VIEWλŠ” 데이터λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ•‘μ…˜
<category> μΈν…νŠΈμ˜ 좔가적인 정보λ₯Ό 제곡
이λ₯Ό 톡해 μ‹œμŠ€ν…œμ΄ μΈν…νŠΈλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 더 μ„ΈλΆ€μ μœΌλ‘œ μ œμ–΄ κ°€λŠ₯
// category android:name="android.intent.category.LAUNCHER"
        -> μ•± μ‹€ν–‰ μ‹œ κ·Έ μ•‘ν‹°λΉ„ν‹°κ°€ λ¨Όμ € 싀행됨
<data> μΈν…νŠΈμ™€ κ΄€λ ¨λœ 데이터λ₯Ό μ§€μ •
URI, MIME, 파일 ν™•μž₯자 λ“±μ˜ ν˜•νƒœλ‘œ 지정될 수 있음
// ex. tel μŠ€ν‚€λ§ˆλ₯Ό κ°€μ§„ 데이터λ₯Ό 닀루기 μœ„ν•΄ <data android:scheme='tel'/>

 

    (2) 일반적 μ‚¬μš©λ²•
            : μ•”μ‹œμ  μΈν…νŠΈλŠ” 주둜 λ‹€λ₯Έ μ•±μ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 데 μ‚¬μš©λ¨
            ex. μ‚¬μš©μžκ°€ '지도 보기'λ₯Ό μš”μ²­ν•  λ•Œ, ν•΄λ‹Ή μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” λͺ¨λ“  μ•± 쀑 μ‚¬μš©μžκ°€ 선택할 수 있게 λͺ©λ‘ 제곡

 

2. μΈν…νŠΈ 객체 λΆ„μ„ν•˜κΈ°

1) μ»΄ν¬λ„ŒνŠΈ 이름
        : νƒ€κ²Ÿ μ»΄ν¬λ„ŒνŠΈμ˜ 이름을 λͺ…μ‹œν•΄, μΈν…νŠΈκ°€ 전달될 μ •ν™•ν•œ λŒ€μƒμ„ μ§€μ •
            ex.  new Intent(context, TargetActivity.class) μ—μ„œ TargetActivity.class κ°€ μ»΄ν¬λ„ŒνŠΈ μ΄λ¦„μž„

        - μ»΄ν¬λ„ŒνŠΈ 이름이 μ—†μœΌλ©΄ μΈν…νŠΈλŠ” μ•”μ‹œμ μœΌλ‘œ 처리되고, μ‹œμŠ€ν…œμ΄ μ μ ˆν•œ λŒ€μƒμ„ 찾음

 

2) μ•‘μ…˜
        : μΈν…νŠΈκ°€ μˆ˜ν–‰ν•΄μ•Ό ν•  일반적인 μž‘μ—…μ„ μ •μ˜. μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  μž‘μ—…μ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄

        - ex.  Intent.ACTION_VIEW : μ‚¬μš©μžμ—κ²Œ 데이터λ₯Ό 보여쀄 λ•Œ μ‚¬μš©λ¨
        - ex.  Intent.ACTION_DIAL   : μ „ν™” 닀이얼을 μ—΄κΈ° μœ„ν•΄ μ‚¬μš©

 

3) 데이터
        : μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λ°μ΄ν„°μ˜ URI(μ •λ³΄μ˜ κ³ μœ ν•œ λͺ…μΉ­. url보닀 μƒμœ„)λ₯Ό 지정함
            ex.  Uri.parse("tel:12345")  : μ „ν™” 앱에 μ „ν™”λ²ˆν˜Έ 데이터λ₯Ό 제곡         

μž‘μ—…(μ•‘μ…˜) 데이터 μ„€λͺ…
ACTION_VIEW   μ›ΉνŽ˜μ΄μ§€λ₯Ό ν‘œμ‹œ
ACTION_CALL tel:114 114번 μ „ν™”λ²ˆν˜Έλ‘œ μ „ν™”μ—°κ²° μ‹œμž‘
ACTION_DIAL tel:114 114번 μ „ν™”λ²ˆν˜Έλ‘œ μ „ν™”κ±ΈκΈ° ν™”λ©΄ ν‘œμ‹œ

        - λ°μ΄ν„°λŠ” 보톡 Uri 객체둜 μ•‘μ…˜κ³Ό κ²°ν•©ν•΄ μ‚¬μš©λ¨

 

4) μΉ΄ν…Œκ³ λ¦¬
        : μΈν…νŠΈμ˜ μœ ν˜•μ„ 더 ꡬ체적으둜 μ§€μ •ν•˜μ—¬, μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈκ°€ μ²˜λ¦¬ν•  수 μžˆλŠ”μ§€ μ•Œλ €μ€Œ

        - ex.  Intent.CATEGORY_HOME  : ν™ˆ ν™”λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•  λ•Œ μ‚¬μš©λ¨

μΉ΄ν…Œκ³ λ¦¬ μ„€λͺ…
CATEGORY_BROWSABLE λŒ€μƒ μ•‘ν‹°λΉ„ν‹°κ°€ μ›ΉλΈŒλΌμš°μ €μ— μ˜ν•΄ μ‹œμž‘λ˜μ–΄μ„œ 이미지와 같은 데이터λ₯Ό ν‘œν˜„ν•  수 있음
CATEGORY_LAUNCHER 이 μ•‘ν‹°λΉ„ν‹°κ°€ μž‘μ—…μ˜ 졜초 앑티비티이고, 이것이 μ‹œμŠ€ν…œμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ κ΄€λ¦¬μžμ— λͺ©λ‘μœΌλ‘œ κ²Œμž¬λ˜μ–΄ 있음

 

5) μ—‘μŠ€νŠΈλΌ
        : λ³΅μž‘ν•œ 데이터λ₯Ό μΈν…νŠΈμ— μ „λ‹¬ν•˜κΈ° μœ„ν•œ ν‚€-κ°’ 쌍의 μΆ”κ°€ 정보
            ex.  intent.putExtra("extra_key", "value") μ—μ„œ "extra_key" λŠ” 전달할 λ°μ΄ν„°μ˜ 킀이고, "value"λŠ” μ‹€μ œ κ°’μž„

        - μ—‘μŠ€νŠΈλΌλ₯Ό 톡해 κΈ°λ³Έ νƒ€μž…λΆ€ν„° Serializable 객체가지 λ‹€μ–‘ν•œ 데이터 전달 κ°€λŠ₯

 

3. λͺ…μ‹œμ  μΈν…νŠΈλ‘œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹° μ‹œμž‘ν•˜κΈ°

    - λͺ…μ‹œμ  μΈν…νŠΈλŠ” νŠΉμ •ν•œ μ•‘ν‹°λΉ„ν‹°λ₯Ό μ‹œμž‘ν•  λ•Œ μ‚¬μš©λ¨.
        (μ•ˆλ“œλ‘œμ΄λ“œλŠ” 이λ₯Ό 톡해 ν˜„μž¬ μ•‘ν‹°λΉ„ν‹°μ—μ„œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹°λ‘œ μ „ν™˜ν•  수 있음)

// ν˜„μž¬ μ•‘ν‹°λΉ„ν‹°μ—μ„œ AnotherActivityλ₯Ό μ‹œμž‘ν•˜κΈ° μœ„ν•œ λͺ…μ‹œμ  μΈν…νŠΈ 생성
val intent = Intent(this, AnotherActivity::class.java)

// μΈν…νŠΈμ— 데이터 μΆ”κ°€ (μ˜΅μ…˜)
intent.putExtra("key", "value")

// AnotherActivity μ‹œμž‘
startActivity(intent)

    1) μΈν…νŠΈ 생성 : Intent 클래슀의 객체λ₯Ό 생성함

            - λ§€κ°œλ³€μˆ˜ : ν˜„μž¬ μ»¨ν…μŠ€νŠΈ (this) , μ‹œμž‘ν•˜κ³ μž ν•˜λŠ” μ•‘ν‹°λΉ„ν‹°μ˜ Class 객체

    2) 데이터 전달 (선택사항) : putExtra λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄ μΈν…νŠΈμ— ν‚€-κ°’ 쌍으둜 이루어진 μΆ”κ°€ 데이터 μ‚½μž… κ°€λŠ₯

            - μ‹œμž‘λ  μ•‘ν‹°λΉ„ν‹°μ—μ„œ 이 데이터λ₯Ό μ‚¬μš©ν•  수 있음

    3) μ•‘ν‹°λΉ„ν‹° μ‹œμž‘ : startActivity λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄ μΈν…νŠΈλ₯Ό μ‚¬μš©ν•¨

            - 이 호좜이 μ‹€ν–‰λ˜λ©΄ μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œμ€ λͺ…μ‹œλœ μΈν…νŠΈμ— 따라 AnotherActivityλ₯Ό μ‹œμž‘ν•¨

-> ν˜„μž¬ μ•‘ν‹°λΉ„ν‹°μ—μ„œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹°λ‘œμ˜ μ „ν™˜μ„ λͺ…ν™•ν•˜κ²Œ μ œμ–΄ κ°€λŠ₯ (μ•±μ˜ 흐름 관리에 ν•„μˆ˜μ μΈ κΈ°λŠ₯)

 

 

activity μΆ”κ°€ => app > new > Activity > Empty Activity

 

1) activity_first.xml 파일 μˆ˜μ •

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height=“match_parent"
    android:gravity = “center”
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="첫번째 μ•‘ν‹°λΉ„ν‹° μž…λ‹ˆλ‹€."
        android:id="@+id/textView" />

    <Button
        android:layout_width=“wrap_content"
        android:layout_height="wrap_content"
        android:text="λ‘λ²ˆμ§Έ μ•‘ν‹°λΉ„ν‹° μ‹œμž‘ν•˜κΈ°"
        android:id="@+id/buttonFirstActivity"
        android:layout_marginTop="43dp" />

</LinearLayout>

 

2) activity_Second.xml μˆ˜μ •

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="λ‘λ²ˆμ§Έ μ•‘ν‹°λΉ„ν‹° μž…λ‹ˆλ‹€."
        android:id="@+id/textView" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="λ‹«κΈ°"
        android:id="@+id/buttonSecondActivity"
        android:layout_marginTop="43dp" />

</LinearLayout>

 

3) FirstActivity μˆ˜μ •

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)
        }
    }
}

 

4) SecondActivity μˆ˜μ •

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()
        }
    }
}

 

4. μ•”μ‹œμ  μΈν…νŠΈλ‘œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹° μ‹œμž‘ν•˜κΈ°

    : μ•”μ‹œμ  μΈν…νŠΈλ‘œ λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹°λ₯Ό μ‹œμž‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈν…νŠΈ μ•ˆμ— μž‘μ—…κ³Ό 데이터λ₯Ό μ§€μ •ν•΄μ•Ό 함

    ex. 114 번호둜 닀이얼 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μ•‘ν‹°λΉ„ν‹° μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ call_intent 생성 ν›„ startActivity()λ©”μ†Œλ“œμ— 전달
            tel:114 = μ „ν™”λ²ˆν˜Έ 114의 URI 객체

val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
startActivity(call_intent)
    <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"/>
package com.example.acrivityintent2

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.Button
//import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
//import androidx.core.view.ViewCompat
//import androidx.core.view.WindowInsetsCompat

class FirstActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //enableEdgeToEdge()
        setContentView(R.layout.activity_first)
//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
//            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
//            insets
//        }

        val btn = findViewById<Button>(R.id.buttonFirstActivity)
        btn.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            startActivity(intent)
        }
    }
    fun doOnBtnClick(view: View){
        when(view.id){
            R.id.buttonDialActivity -> {
                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)
            }
        }
    }
}

 

 

μ½”λ“œ μ •λ ¬ -> ctrl + alt + L