티스토리 뷰
인텐트에 대하여 알아봅시다.
인텐트는 '요청'이라고 이해하면 쉽습니다. 인텐트를 보낸다는 의미는 '요청을 보낸다'는 의미로 이해하면 좋습니다.
이러한 요청의 종류에는 두 가지가 있습니다.
1. 전달만 하는 요청
2. 전달한 후에 리턴을 받는 요청
전자는 인텐트A가 인텐트B에게 어떤 값이나 데이터만 전달하는 경우입니다. 후자는 전달과 더불어 처리된 결과 값을 받는 경우를 의미합니다.
인텐트의 종류에는 두 가지가 있습니다.
1. 명시적인 인텐트(Explicit Intent)
2. 묵시적인/암시적인 인텐트(Implicit Intent)
전자는 인텐트A가 인텐트B라는 정확한 대상에게 요청하는 경우입니다. 후자는 인텐트A가 전화거는 기능, 공유 기능, 인터넷 페이지 열기 등의 기능을 사용해서 정해지지 않은 여러 대상에게 기능을 요청하면, 사용자가 기능을 수행할 대상을 선택하도록 합니다. 전화는 어떤 전화기 어플로 선택할 것인지, 공유는 카톡이나 라인 등 어떤 앱으로 공유할 것인지, 인터넷 페이지 여는 것은 어떤 브라우저(크롬, 사파리 등)로 페이지를 열 것인지 선택하도록 합니다. 이러한 경우를 묵시적인/암시적인 인텐트라고 합니다.
인텐트를 사용하는 경우 세 가지로 요약해 볼 수 있습니다.
1. 인텐트를 통해서 액티비티와 액티비티가 요청을 주고 받는 경우입니다.
2. 인텐트를 통해서 안드로이드 시스템과 내 앱이 요청을 주고 받는 경우입니다. 인텐트로 전화 걸기 기능을 요청하면 내 앱에서 전화를 거는 경우입니다. 배달/택시 어플에서 '전화기' 버튼을 클릭하면 바로 전화를 거는 것처럼 말이죠.
3. 인텐트를 통해서 다른 앱과 내 앱이 요청을 주고 받는 경우입니다. 내 앱에서 결제 버튼을 누를 때 카톡/토스 등의 결제 앱으로 연동이 되는 경우를 말합니다.
그럼 코드를 통해서 인텐트를 더욱 자세히 알아봅시다. 우선 명시적 인텐트부터 확인해 봅니다.
인텐트1에서 인텐트2로 결과 값을 보낸다고 가정합시다. 요청에는 전달만 하는 요청과 리턴 값까지 받는 요청이 있다고 했습니다.
우선 인텐트1의 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".Intent1">
<Button
android:layout_width="100dp"
android:layout_height="100dp"
android:text="인텐트"
android:id="@+id/change"/>
</LinearLayout>
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
change.setOnClickListener {
val intent = Intent(this@Intent1, Intent2::class.java)
intent.putExtra("number",1)
intent.putExtra("number2",2)
startActivity(intent)
}
}
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
val intent2 = Intent(this@Intent1, Intent2::class.java)
intent2.apply {
this.putExtra("number1", 1)
this.putExtra("number2", 2)
}
startActivityForResult(intent2, 100)
}
위의 코드를 보면, Intent1이란 클래스의 onCreate 메소드를 봅니다. 액티비티가 생성되자마자, 액티비티 화면 부분에서 정의해준 ID값 change를 클릭했을 때, 인텐트 요청이 일어나도록 코딩한 것입니다.
인텐트를 만드는 방법은 Intent( ) 안에 this@요청을 주는 인텐트, 요청을 받는 인텐트::class.java, 이렇게 두 개의 인수를 넣어주게 됩니다.
this@Intent1 대신에 this만 적어줘도, 의미상 같으나 @Intent1로 적어주는 이유는 요청주는 인텐트를 정확히 알려서 충돌을 예방하기 위함이빈다. Intent2::class.java의 경우, 요청 받는 인텐트 뒤에 콜론 2개와 class.java를 적습니다.
putExtra 메소드를 이용해서 보내려는 값을 전달합니다. 이렇게 인텐트에 정보를 담으려면, 키와 밸류 값을 쌍으로 모두 적어서 딕셔너리 형태로 저장해서 보내줍니다.
마지막으로 startActivity 메소드로 요청을 보내게 됩니다. startActivity는 인텐트2로 요청만 전달하지, 리턴 값을 불러올 수는 없다는 점에 유의하십시오.
* 맨 마지막은 코드는 apply 함수를 활용한 경우입니다. apply를 사용하는 이유는 해당 메소드 블록에서 모든 인텐트 작업이 진행되는 것을 쉽게 파악하기 위해서 입니다. 인텐트가 많아지면 헷갈리기 때문에 apply로 인텐트마다 묶어서 코드를 보기 쉽게 만들기 위함힙니다.
startActivityForResult(intent2, 100) 또한 요청을 보내는 부분입니다. startActivity( )와는 다르게, 보낸 요청을 인텐트2에서 처리하면, 다시 받을 수 있게 됩니다. 인자 값으로는 리턴해주는 인텐트 명칭과 결과 코드를 적게됩니다. 결과 코드에 대해서는 뒤에서 설명하도록 하겠습니다.
다음은 인텐트2의 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:background="#FFEB3B"
tools:context=".Intent2">
<Button
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/result"
android:text="결과"/>
</LinearLayout>
class Intent2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent2)
result.setOnClickListener {
val number1 = intent.getIntExtra("number1", 0)
val number2 = intent.getIntExtra("number2", 0)
Log.d("number", ""+ number1)
Log.d("number", ""+ number2)
val result = number1 + number2
val resultIntent = Intent()
resultIntent.putExtra("result", result)
setResult(Activity.RESULT_OK, resultIntent)
this.finish()
}
}
}
인텐트1에서 받은 값을 인텐트2에서 불러올 때는 타입을 체크해줘야 합니다. 인텐트1에서 값을 저장 시 putExtra로 저장했다면, 값을 가져올 때는 getIntExtra 처럼 타입이 명시된 함수로 가져오게 됩니다. getIntExtra에서 0 부분은 디폴트 값으로 값을 가져오지 못하는 경우 표시되는 숫자입니다.
result라는 변수에 number1과 number2가 합쳐진 숫자를 저장합니다.
resultIntent라는 인텐트를 생성합니다.
해당 인텐트에 putExtra를 사용해 result 값을 넣어주게 됩니다.
setResult에 resultIntent의 결과를 넣어서 전송할 준비를 합니다. Activity.RESULT_OK는 결과를 잘 받았는지, 실패했는지 알려주기 위한 코드값입니다. -1, 0, 1 등으로 넣을 수 있는데, Activity.RESULT_OK, 이런식으로 변수 명칭을 직접 넣어주는 것이 좋습니다. setResult의 두 번째 인자로는 만들어준 resultIntent를 넣습니다. 해당 인텐트에는 result의 결과 값이 들어있겠죠?
아래는 Activity.RESULT_OK와 같이 실패하거나 다른 경우의 변수명과 이에 매치되는 Int 타입의 코드입니다. 참고하시면 좋을 것 같습니다.
마지막으로 this.finish( )를 통해서 인텐트2를 종료해줍니다. 인텐트는 스택 형태로 쌓이게 되는데, 인텐트2를 종료시켜, 인텐트1으로 돌아오기 위함입니다.
다시 인텐트1으로 돌아와서 인텐트2의 결과를 보여줘야 합니다.
아래의 코드를 살펴봅니다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == 100){
Log.d("number", ""+ requestCode)
Log.d("number", ""+ resultCode)
val result = data?.getIntExtra("result", 0)
Log.d("number", ""+ result)
}
super.onActivityResult(requestCode, resultCode, data)
}
인텐트1에서 onCreate( )를 벗어나, 다음의 onActivityResult로 인텐트2의 결과값을 받아오게 됩니다.
앞의 인텐트1 코드 부분에서 요청을 보내는 부분인 startActivityForResult(intent2, 100) 기억하시나요?
여기서 리퀘스트 코드 100을 지정한 이유는, 인텐트2에서 보내는 요청이 여러 인텐트가 존재할 수 있기에, 정확히 어떤 인텐트가 보내는지 구분짓기 위해서 코드명을 붙인 것입니다. 코드는 숫자 타입만 가능합니다.
if (requestCode == 100) 처럼, 코드가 일치하면, 인텐트2의 결과를 보여주게 됩니다.
data:Intent? 부분에 setResult(Activity.RESULT_OK, resultIntent)의 resultIntent 값이 들어오게 됩니다.
각각 로그에 출력되는 값을 보자면,
requestCode = 100
resultCode = -1
result = 3 으로 들어오게 됩니다.
여기서 resultCode는 인텐트2에서 Activity.RESULT_OK 부분의 코드값 -1입니다.
* 추가적으로 묵시적인/암시적인 인텐트를 사용하는 경우, 인텐트2를 만들어줄 필요없이, 인텐트1에서만 아래처럼 코드를 작성하시면 됩니다.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"))
startActivity(intent)
위의 코드는 인터넷 웹페이지를 열게 하는 인텐트입니다.
인터넷 주소를 가져올 때는 URI를 파싱해야 하므로, Uri.parse 함수를 사용합니다.
실제 사용자는 어떤 브라우저로 페이지를 열 것인지 선택하게 되어 있으므로, 암시적인 인텐트에 해당합니다.
'Android App Coding' 카테고리의 다른 글
프래그먼트 Fragment (0) | 2021.07.08 |
---|---|
작업 관리(태스크) Task (0) | 2021.07.08 |
View를 Activity로 가져오기 (0) | 2021.07.08 |
액티비티 생명주기 Activity Lifecycle (0) | 2021.07.08 |
안드로이드 스튜디오 완전 삭제하기 (0) | 2021.07.07 |
- Total
- Today
- Yesterday
- 안드로이드 프로젝트
- notifyDataSetChanged
- Bmi Calculator
- 미제사건
- 안드로이드 어댑터
- lazy init
- 상대적 레이아웃
- tabLayout
- 리사이클러뷰
- 메소드 오버라이딩
- RecyclerView
- 선형 레이아웃
- 인텐트
- 안드로이드 스튜디오 에러
- 2021년 사건사고
- 뷰 바인딩
- ToDo List 앱 만들기
- 리스트뷰
- bmi 계산기 만들기
- 안드로이드 앱 만들기
- 애드뷰
- view binding
- 2007년 사건사고
- android adapter
- addView
- 탭레이아웃
- 대한민국 미제사건
- findViewById
- 2019년 사건사고
- 자바스크립트 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |