- 앱 구성 요소(액티비티, 서비스, Broadcast Reciver, 콘텐츠 제공자)간 데이터 요구, 의사 전달, 요청
요청 관계
- Activity와 Activity끼리 주고 받을 때
- Android System과 내 app 사이
- 다음 app과 내 app (앱끼리의 연동) -> 무작정 사용 불가, 상호합의 필요
인텐트 유형
- 명시적 인텐트 : 인텐트를 충족하는 대상을 지정해 요청
- android:visibility="invisible" : 특정 대상을 지정하지는 않지만 수행할 수 있는 대상에 요청

화면 전환
Intent1에서 Intent2로 화면 전환
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_intent.*
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
change_activity.setOnClickListener {
val intent = Intent(this@Intent1, Intent2::class.java)
// this나 this@Intent1(this보다 정확)을 넣어주면 됨.
// key, value 방식 or Dictionary -> key와 value를 쌍으로 만들어 저장한다.
startActivity(intent)
}
}
}

Activity간 데이터 전달
1. 명시적 인텐트
1) Activity에서 데이터 보내기 : `putExtra` 사용
2) Activity에서 데이터 받기 : `getExtra` 사용
1) Intent1에서 Intent2로 데이터 보내기
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
change_activity.setOnClickListener {
val intent = Intent(this@Intent1, Intent2::class.java)
/* 데이터 보내기 */
intent.putExtra("number1",1)
intent.putExtra("number2",2)
startActivity(intent)
}
}
}
- Intent1에서 1을 가진 number1와 2의 값을 가진 number2 를 Intent2로 보낸다.
val intent2 = Intent(this@Intent1, Intent2::class.java)
// Apply -> intent 대신 this를 사용할 수 있게 해줌
intent2.apply {
this.putExtra("number1", 1)
this.putExtra("number2", 2)
}
startActivity(intent2) // 전달만 하는 요청
- 앞에서 데이터를 보낸 방식과 결과는 같지만 다른 표현법.
2) Intent2에서 Intent1이 보낸 데이터 받기
class Intent2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent2)
// 값을 받는다.
// 값이 없을 경우를 대비해 default값을 넣어줌 -> 값이 없으면 0나옴
val number1 = intent.getIntExtra("number1", 0)
val number2: Int = intent.getIntExtra("number2", 0)
num_data.text = number1.toString()
// Log를 이용해 값 확인 가능
Log.d("number", number1.toString())
Log.d("number", number2.toString())
}
}


Intent2에서 TextView를 이용해 값을 보여줄 수 있는 부분을 만들어 주었다.
`TextView`의 `id`를 `num_data`로 설정해주고, `num_data.text`를 통해 값을 액티비티에 나타낼 수 있다.
1) Intent2에서 Intent1으로 데이터 보내기
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_intent2.*
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: Int = intent.getIntExtra("number2", 0)
Log.d("number", number1.toString())
Log.d("number", number2.toString())
val result = number1 + number2
val resultIntent = Intent() // intent를 만들어 준다.
resultIntent.putExtra("result", result) // 만들어준 intent에 값을 넣는다
setResult(RESULT_OK, resultIntent) // RESULT_OR는 -1임. 그냥 -1적는 것 보다 읽기가 편하다
// resultcode와 intent에 넣어줄 결과값(데이터)이 파라미터
// setResult(RESULT_CANCELED) canceled는 0
finish() // -> Activity 종료
}
}
}
- `finish()`를 통해 Intent1에서 Intent2로 전환했던 화면을 다시 Intent1으로 되돌릴 수 있다.
- `setResult`에 넣어준 `RESULT_OK`값은 -1 이지만 명시적으로 표현을 쉽게 하기 위해 `RESULT_OK`로 표현
- `RESULT_CANCELED`는 0이다.
2) Intent1에서 Intent2가 보낸 데이터 받기
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_intent.*
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
change_activity.setOnClickListener {
val intent2 = Intent(this@Intent1, Intent2::class.java)
// Apply -> intent 대신 this를 사용할 수 있게 해줌
intent2.apply {
this.putExtra("number1", 1)
this.putExtra("number2", 2)
}
//startActivity(intent2) // 전달만 하는 요청
startActivityForResult(intent2, 200) // 리턴을 받는 요청
// int형인 requestCode가 필요
// Intent2에 요청하는 액티비티가 Intent1말고도 여러 액티비티가 존재할 수 있다.
// 따라서, 구분하는 이름을 숫자로 넣어줌.
// 이름이 200인 intent2를 intent1에 보내줌
}
}
// 위의 intent의 결과를 받으려면 필요하다.
// intent2의 setResult(RESULT_OR)가 resultCode에 들어감
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == 200){ // 200인지 확인
Log.d("number", requestCode.toString()) // 200
Log.d("number", resultCode.toString()) // RESULT_OR이어서 -1
val result = data?.getIntExtra("result", 0)
Log.d("number", result.toString())
// 데이터 값 1과 2를 합친 3이 나옴.
}
super.onActivityResult(requestCode, resultCode, data)
}
}
- `reseultCode`에는 Intent2에서 만들어준 `RESULT_OK (-1)`이, `data`에는 Intent2의 resultIntent 변수값이 들어온다.
- `startActivity`는 전달만 하는 요청이라서 리턴을 받는 요청인 `startActivityForResult(intent, requestCode)`를 사용한다.
- Intent2에 요청하는 액티비티가 하나이상일 수도 있기때문에, 어디서 요청이 왔는지 구분하는 `requestCode(int형)` 를 넣어주어야 한다.

실행 후 Logcat을 살펴 보면 앞서 Intent1에서 보낸 데이터 `number1`, `number2`와 `requestCode` 값, Intent2에서 보낸 데이터 값인 `resultCode`와 `result(number1 + number2)`값이 차례대로 나오고 있다.
2. 암시적 인텐트
- Uri를 호출할 수있는 대상에게 인텐트를 요청한다.
- 예를들어, 웹 주소를 열 수 있는 브라우저가 여러개면 크롬, 웨일, 익스플로러 등 선택하여 화면을 띄울 수 있다.
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_intent.*
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
change_activity.setOnClickListener {
/*** 암시적 인텐트 ***/
// 인터넷 페이지를 열수있는 브라우저(크롬, 웨일 등)에서 열림
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"))
startActivity(intent)
}
}
}
'안드로이드 > 정리' 카테고리의 다른 글
| [안드로이드] RelativeLayout (0) | 2021.09.21 |
|---|---|
| [안드로이드] LinearLayout (0) | 2021.09.19 |
| [안드로이드] invisible과 gone (0) | 2021.09.18 |
| [안드로이드] ConstraintLayout (0) | 2021.09.18 |
| [안드로이드] drawable의 Shape (0) | 2021.09.16 |