티스토리 뷰

728x90

 


Intent

• 의도, 의사가 담긴 메시징 객체

• 다른 컴포넌트에게 작업을 요청할 때, 어떠한 작업을 요청하는지, 누구에게 요청하는지 등에 대한 정보를 인텐트 객체에 담아 전달한다.

• 데이터를 담아 전달할 수 있다.

     ex) 010-0000-0000(데이터)로 전화해줘.

• 요청한 작업의 결과를 받을 수 있다.

 

Intent 종류

1. 명시적 인텐트 (Explicit Intent)

• 호출 대상을 명시하는 경우

ex) ㅇㅇ앱으로 사진 찍을거야 -> ㅇㅇ앱 호출 및 실행

 

2. 암시적 인텐트 (Implicit Intent)

• 호출 대상을 명시하지 않는 경우

ex) 사진 찍을거야 -> 사진 찍을 수 있는 모든 앱 호출

• 인텐트 필터 (Intent-filter)

     - 매니페스트 파일에 인텐트 필터를 등록할 수 있다.

     - 암시적 인텐트 시 인텐트 객체에 담긴 내용과 맞는 필터를 가진 컴포넌트를 호출한다.

     ex) 사진 찍을거야 -> 사진 찍기라는 필터가 있는 모든 앱 호출.

 

Intent 가능 대상

• 앱 내

     - 액티비티 끼리(화면 전환)

• 앱 외부

     - 안드로이드 OS, 시스템

     - 다른 앱(권한 필요)

 

Intent의 사용

1. 암시적 인텐트

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - Intent 객체에 원하는 액션(여기서는 전화걸기) 입력.

          -> 전화 걸기가 가능한 앱 모두 호출.

     - startActivity(Intent) 함수 사용.

package com.example.fastcampus

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL) // 원하는 액션 입력
            startActivity(intent) // startActivity 함수 사용
        }
    }
}

 

• 결과

암시적 인텐트 박스를 누르면 전화 앱으로 연결

 

 

2. 암시적 인텐트 - 데이터 전달

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - URI 형태로 데이터를 전달한다.

     - 요청한 작업에 따라 전달하는 데이터의 방식도 달라진다.

          -> 다 외울 순 없고 찾아보면서 하면 된다.

package com.example.fastcampus

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111")) // 원하는 액션 입력 및 전화번호 데이터를 uri 형태로 전달.
            startActivity(intent)
        }
    }
}

 

• 결과

암시적 인텐트 - 데이터 전달 박스를 누르면 uri 방식으로 전달한 전화번호 데이터가 입력된 채로 전화 앱 실행

 

3. 명시적 인텐트 - ComponentName 방식

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• activity_intent_two06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".IntentTwo_06">

    <TextView
        android:id="@+id/text1"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="IntentTwo_06 액티비티"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

• IntentOne_06.kt

     - 호출할 컴포넌트(여기서는 IntentTwo_06 액티비티)를 ComponentName 객체에 명시.

     - Intent 객체의 component 속성에 ComponentName 객체를 넣어 인텐트 대상 지목.

     - ComponentName 방식의 경우 호출할 액티비티 이름을 String으로 직접 입력함.

          -> String으로 직접 입력하면 오타의 가능성이 높고, 오타가 나더라도 오류가 뜨지 않아 알기 힘듦.

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName( // ComponentName 객체 생성
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06" // 호출할 컴포넌트 이름을 String으로 직접 입력.
            )
            intent.component = componentName // Intent 객체의 component 속성에 ComponentName 객체를 넣어 호출할 대상 지목.
            startActivity(intent)
        }
    }
}

 

• 결과

명시적 인텐트 - ComponentName 방식 박스를 누르면 IntentTwo_06 액티비티를 호출.

 

4. 명시적 인텐트 - Context 방식

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

    <TextView
        android:id="@+id/explicitIntentContext"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FF00FF"
        android:gravity="center"
        android:text="명시적 인텐트 - Context 방식" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - 현재 액티비티와 호출할 액티비티를 적는다.

     - Context, Reflection(::) 등의 어려운 문법이 쓰이는데, 아직은 모든 문장을 이해할 필요 없다.

          -> 써보면서 익히자.

     - ComponentName 방식보다 Context 방식을 많이 쓴다.

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName(
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06"
            )
            intent.component = componentName
            startActivity(intent)
        }

        // 명시적 인텐트 - Context 방식
        val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
        explicitIntent2.setOnClickListener {
            val intent: Intent = Intent(this, IntentTwo_06::class.java) // 현재 액티비티와 호출할 액티비티를 적는다.
            startActivity(intent)
        }
    }
}

 

• apply를 이용하여 View 변수 생성을 생략할 수 있다.

     - apply는 객체 접근 시 객체 이름으로 호출할 필요없이 바로 접근할 수 있게 도와준다.

// 명시적 인텐트 - Context 방식
(findViewById<TextView>(R.id.explicitIntentContext)).apply { // 변수를 생성하지 않고 apply 사용.
    this.setOnClickListener {
    	startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
        // apply 안에서 this는 지금 apply를 쓰고 있는 TextView이기 때문에 this로 IntentOne_06 클래스를 가리키기 위해서는 @IntentOne_06이 필요하다.
    }
}

 

• 결과

명시적 인텐트 - Context 방식 박스를 누르면 IntentTwo_06 액티비티를 호출.

 

5. 명시적 인텐트 - 간단한 데이터 전달

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

    <TextView
        android:id="@+id/explicitIntentContext"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FF00FF"
        android:gravity="center"
        android:text="명시적 인텐트 - Context 방식" />

    <TextView
        android:id="@+id/explicitIntentWithSimpleData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#BBBBBB"
        android:gravity="center"
        android:text="명시적 인텐트 - 간단한 데이터 전달" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - 요청 하는 쪽

     - putExtra() 함수 사용.

     - key, value 형식으로 데이터 전달.

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName(
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06"
            )
            intent.component = componentName
            startActivity(intent)
        }

        // 명시적 인텐트 - Context 방식
//        val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
//        explicitIntent2.setOnClickListener {
//            val intent: Intent = Intent(this, IntentTwo_06::class.java)
//            startActivity(intent)
//        }
        // View 변수 생성 생략
        (findViewById<TextView>(R.id.explicitIntentContext)).apply {
            this.setOnClickListener {
                startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
            }
        }

        // 명시적 인텐트 - 간단한 데이터 전달
        findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
            val intent = Intent(this, IntentTwo_06::class.java)
            intent.putExtra("simple-data", "String Data") // putExtra 함수 사용 : key, value 형식으로 데이터 전달.
            startActivity(intent)
        }
    }
}

 

• IntentTwo_06.kt

     - 요청 받는 쪽

     - 전달받은 Intent 객체를 intent 키워드로 받을 수 있다.

          -> 즉, 다른 요청을 받을 때 마다 intent에 담기는 것이 바뀐다.

     - intent.extras?.getString(key) 형식으로 데이터를 받을 수 있다.

          - 데이터를 보낼 수도 안 보낼 수도 있기 때문에 extras는 nullable 이다.

          - 요청하는 쪽에서 보낸 데이터의 타입에 따라 getString, getInt 등 메소드가 달라진다.

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class IntentTwo_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_two06)

        // 명시적 인텐트 - 간단한 데이터 전달
        val intent = intent // 이 액티비티를 호출한 인텐트가 들어감.
        val data: String? = intent.extras?.getString("simple-data") // data가 있을 수도 없을 수도 있으니 nullable이다.
        if(data!=null) {
            Log.d("dataa", data) // String Data 출력
        }
    }
}

 

• 결과

명시적 인텐트 - 간단한 데이터 전달 박스를 누르면 IntentTwo_06 액티비티를 호출 및 전달된 String Data 출력.

 

6. 명시적 인텐트 - 결과 받기 (startActivityForResult 사용)

• deprecated 됨.

     - 하지만 옛날부터 사용하던 함수라 사용법은 알아야 다른 사람의 코드를 이해할 수 있다.

 

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

    <TextView
        android:id="@+id/explicitIntentContext"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FF00FF"
        android:gravity="center"
        android:text="명시적 인텐트 - Context 방식" />

    <TextView
        android:id="@+id/explicitIntentWithSimpleData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#BBBBBB"
        android:gravity="center"
        android:text="명시적 인텐트 - 간단한 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentWithResult"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#AAAAFF"
        android:gravity="center"
        android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - 요청 하는 쪽

     - startActivityForResult(intent, requestCode)로 요청.

          - requestCode : 어떤 요청에 대한 결과 값인지 구분하기 위한 코드

               ex) activityOne <-> activityTwo (requestCode 1)

                     activityOne <-> activityThree (requestCode 2)

     - onActivityResult(requestCode, resultCode, data) 메소드를 오버라이드하여 요청에 대한 결과를 받을 수 있다.

          - resultCode : 성공, 실패 등의 상태를 알 수 있음.

               ex) RESULT_OK, RESULT_CANCEL

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName(
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06"
            )
            intent.component = componentName
            startActivity(intent)
        }

        // 명시적 인텐트 - Context 방식
//        val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
//        explicitIntent2.setOnClickListener {
//            val intent: Intent = Intent(this, IntentTwo_06::class.java)
//            startActivity(intent)
//        }
        // View 변수 생성 생략
        (findViewById<TextView>(R.id.explicitIntentContext)).apply {
            this.setOnClickListener {
                startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
            }
        }

        // 명시적 인텐트 - 간단한 데이터 전달
        findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
            val intent = Intent(this, IntentTwo_06::class.java)
            intent.putExtra("simple-data", "String Data")
            startActivity(intent)
        }

        // 명시적 인텐트 - 결과 받기(startActivityForResult)
        findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            startActivityForResult(intent, 1)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) { // requestCode로 어떤 요청에 대한 결과 값인지 구분할 수 있다.
            1 -> {
                when (resultCode) { // resultCode로 요청 성공, 실패 등을 알 수 있다.
                    RESULT_OK -> {
                        val dataString: String? = data?.extras?.getString("result")
                        Log.d("dataa", dataString!!) // 받은 결과 값 출력
                    }
                }
            }
        }
    }
}

 

• IntentTwo_06.kt

     - 요청 받는 쪽

     - setResult(resultCode, intent)로 결과 돌려줌.

     - finish()로 액티비티를 끝내면 요청하는 쪽에서 결과를 받음.

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.util.Log
import android.widget.TextView

class IntentTwo_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_two06)

        // 명시적 인텐트 - 간단한 데이터 전달
        val intent = intent
        val data: String? = intent.extras?.getString("simple-data")
        if(data!=null) {
            Log.d("dataa", data)
        }

        // 명시적 인텐트 - 결과 받기
        findViewById<TextView>(R.id.text1).setOnClickListener {
            val intent: Intent = Intent()
            intent.putExtra("result", "success")
            setResult(RESULT_OK, intent) // setResult 함수 사용 : 요청 결과 보냄.
            finish() // finish 함수 사용 : 액티비티 종료
        }
    }
}

 

• 결과

명시적 인텐트 - 결과 받기(startActivityForResult) 박스를 누르면 IntentTwo_06 액티비티를 호출. IntentTwo_06 액티비티 박스를 누르면 IntentTwo_06 액티비티 종료되고 결과 값 반환. 반환된 결과 값 success 출력.

 

7. 명시적 인텐트 - 결과 받기 (ActivityResultLauncher 사용)

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

    <TextView
        android:id="@+id/explicitIntentContext"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FF00FF"
        android:gravity="center"
        android:text="명시적 인텐트 - Context 방식" />

    <TextView
        android:id="@+id/explicitIntentWithSimpleData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#BBBBBB"
        android:gravity="center"
        android:text="명시적 인텐트 - 간단한 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentWithResult"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#AAAAFF"
        android:gravity="center"
        android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />

    <TextView
        android:id="@+id/explicitIntentWithResult2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFAAAA"
        android:gravity="center"
        android:text="명시적 인텐트 - 결과 받기(ActivityResultLauncher)" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - 요청하는 쪽

     - ActivityResultLauncher를 생성하고, 이를 사용한다.

     - requestCode 없이도 어떤 요청에 대한 결과인지 구분할 수 있다.

         - startActivityForResult 방법은 모든 인텐트 결과를 onActivityResult 메소드 하나로 받았기 때문에 requestCode로 인텐트 구분이 필요하다.

         - ActivityResultLauncher 방법은 각 요청마다 다른 ActivityResultLauncher를 생성하여 사용하기 때문에 requestCode가 필요없다.

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName(
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06"
            )
            intent.component = componentName
            startActivity(intent)
        }

        // 명시적 인텐트 - Context 방식
//        val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
//        explicitIntent2.setOnClickListener {
//            val intent: Intent = Intent(this, IntentTwo_06::class.java)
//            startActivity(intent)
//        }
        // View 변수 생성 생략
        (findViewById<TextView>(R.id.explicitIntentContext)).apply {
            this.setOnClickListener {
                startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
            }
        }

        // 명시적 인텐트 - 간단한 데이터 전달
        findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
            val intent = Intent(this, IntentTwo_06::class.java)
            intent.putExtra("simple-data", "String Data")
            startActivity(intent)
        }

        // 명시적 인텐트 - 결과 받기(startActivityForResult)
        findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            startActivityForResult(intent, 1)
        }

        // 명시적 인텐트 - 결과 받기(ActivityResultLauncher)
        val startActivityLauncher: ActivityResultLauncher<Intent> = registerForActivityResult( // ActivityResultLauncher 생성
            ActivityResultContracts.StartActivityForResult()
        ) { // 이 블록에서 해당 요청의 결과 값을 바로 받는다. -> requestCode가 필요없다.
            when(it.resultCode) {
                RESULT_OK -> {
                    Log.d("dataa", it.data?.extras?.getString("result")!!)
                }
            }
        }
        findViewById<TextView>(R.id.explicitIntentWithResult2).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            startActivityLauncher.launch(intent) // 생성한 ActivityResultLauncher의 launch 메소드로 intent 전달
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            1 -> {
                when (resultCode) {
                    RESULT_OK -> {
                        val dataString: String? = data?.extras?.getString("result")
                        Log.d("dataa", dataString!!)
                    }
                }
            }
        }
    }
}

 

• 결과

명시적 인텐트 - 결과 받기(ActivityResultLauncher 사용) 박스를 누르면 IntentTwo_06 액티비티를 호출. IntentTwo_06 액티비티 박스를 누르면 IntentTwo_06 액티비티 종료되고 결과 값 반환. 반환된 결과 값 success 출력.

 

 

8. 명시적 인텐트 - 이미지 데이터 전달

• 사용 빈도가 높거나 한 기능은 아니다.

• 인텐트 시 데이터를 전달할 때 key-value 형식의 데이터도 되고, 다른 타입의 데이터도 된다 정도만 알면 된다.

 

• activity_intent_one06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".IntentOne_06">

    <TextView
        android:id="@+id/implicitIntent"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFFF00"
        android:gravity="center"
        android:text="암시적 인텐트" />

    <TextView
        android:id="@+id/implicitIntentWithData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="암시적 인텐트 - 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentComponentName"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#00FFFF"
        android:gravity="center"
        android:text="명시적 인텐트 - ComponentName 방식" />

    <TextView
        android:id="@+id/explicitIntentContext"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FF00FF"
        android:gravity="center"
        android:text="명시적 인텐트 - Context 방식" />

    <TextView
        android:id="@+id/explicitIntentWithSimpleData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#BBBBBB"
        android:gravity="center"
        android:text="명시적 인텐트 - 간단한 데이터 전달" />

    <TextView
        android:id="@+id/explicitIntentWithResult"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#AAAAFF"
        android:gravity="center"
        android:text="명시적 인텐트 - 결과 받기(startActivityForResult)" />

    <TextView
        android:id="@+id/explicitIntentWithResult2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#FFAAAA"
        android:gravity="center"
        android:text="명시적 인텐트 - 결과 받기(ActivityResultLauncher)" />

    <TextView
        android:id="@+id/explicitIntentWithImageData"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="1dp"
        android:background="#AAFFAA"
        android:gravity="center"
        android:text="명시적 인텐트 - 이미지 데이터 전달" />

</androidx.appcompat.widget.LinearLayoutCompat>

 

• IntentOne_06.kt

     - 요청하는 쪽

package com.example.fastcampus

import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.KeyEventDispatcher.Component
import org.w3c.dom.Text

class IntentOne_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_one06)

        // 암시적 인텐트
        val implicitIntent: TextView = findViewById(R.id.implicitIntent)
        implicitIntent.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL)
            startActivity(intent)
        }

        // 암시적 인텐트 - 데이터 전달
        val implicitIntentWithData: TextView = findViewById(R.id.implicitIntentWithData)
        implicitIntentWithData.setOnClickListener {
            val intent: Intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "010-1111-1111"))
            startActivity(intent)
        }

        // 명시적 인텐트 - ComponentName 방식
        val explicitIntent1: TextView = findViewById(R.id.explicitIntentComponentName)
        explicitIntent1.setOnClickListener {
            val intent: Intent = Intent()
            val componentName: ComponentName = ComponentName(
                "com.example.fastcampus",
                "com.example.fastcampus.IntentTwo_06"
            )
            intent.component = componentName
            startActivity(intent)
        }

        // 명시적 인텐트 - Context 방식
//        val explicitIntent2: TextView = findViewById(R.id.explicitIntentContext)
//        explicitIntent2.setOnClickListener {
//            val intent: Intent = Intent(this, IntentTwo_06::class.java)
//            startActivity(intent)
//        }
        // View 변수 생성 생략
        (findViewById<TextView>(R.id.explicitIntentContext)).apply {
            this.setOnClickListener {
                startActivity(Intent(this@IntentOne_06, IntentTwo_06::class.java))
            }
        }

        // 명시적 인텐트 - 간단한 데이터 전달
        findViewById<TextView>(R.id.explicitIntentWithSimpleData).setOnClickListener {
            val intent = Intent(this, IntentTwo_06::class.java)
            intent.putExtra("simple-data", "String Data")
            startActivity(intent)
        }

        // 명시적 인텐트 - 결과 받기(startActivityForResult)
        findViewById<TextView>(R.id.explicitIntentWithResult).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            startActivityForResult(intent, 1)
        }

        // 명시적 인텐트 - 결과 받기(ActivityResultLauncher)
        val startActivityLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) {
            when(it.resultCode) {
                RESULT_OK -> {
                    Log.d("dataa", it.data?.extras?.getString("result")!!)
                }
            }
        }
        findViewById<TextView>(R.id.explicitIntentWithResult2).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            startActivityLauncher.launch(intent)
        }

        // 명시적 인텐트 - 이미지 데이터 전달
        findViewById<TextView>(R.id.explicitIntentWithImageData).setOnClickListener {
            val intent = Intent(this@IntentOne_06, IntentTwo_06::class.java)
            val imageUri = Uri.parse("android.resource://" + packageName + "/drawable/" + "dog") // 전달할 이미지를 URI 방식으로 선언
            intent.action = Intent.ACTION_SEND
            intent.putExtra(Intent.EXTRA_STREAM, imageUri) // 이미지 전달
            intent.setType("image/*") // 모든 타입의 이미지로 타입을 정한다.

            startActivity(intent)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            1 -> {
                when (resultCode) {
                    RESULT_OK -> {
                        val dataString: String? = data?.extras?.getString("result")
                        Log.d("dataa", dataString!!)
                    }
                }
            }
        }
    }
}

 

• activity_intent_two06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".IntentTwo_06">

    <TextView
        android:id="@+id/text1"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="IntentTwo_06 액티비티"/>

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintTop_toBottomOf="@id/text1" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

• IntentTwo_06.kt

     - 요청 받는 쪽

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.net.Uri
import android.os.Parcelable
import android.util.Log
import android.widget.ImageView
import android.widget.TextView

class IntentTwo_06 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent_two06)

        // 명시적 인텐트 - 간단한 데이터 전달
        val intent = intent
        val data: String? = intent.extras?.getString("simple-data")
        if(data!=null) {
            Log.d("dataa", data)
        }

        // 명시적 인텐트 - 결과 받기
        findViewById<TextView>(R.id.text1).setOnClickListener {
            val intent: Intent = Intent()
            intent.putExtra("result", "success")
            setResult(RESULT_OK, intent)
            finish()
        }

        // 명시적 인텐트 - 이미지 데이터 전달
        val imageView = findViewById<ImageView>(R.id.imageView)
        val uri = Uri.parse(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM).toString()) // 전달받은 이미지 uri 저장
        imageView.setImageURI(uri) // 이미지 출력
    }
}

 

• 결과

명시적 인텐트 - 이미지 데이터 전달 박스를 누르면 IntentTwo_06 액티비티를 호출 및 이미지 데이터 전달. IntentTwo_06 액티비티에 출력된다.

 

 

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항