Android

[Android] Intent란?, Intent를 이용한 화면 전환하기

JunsuKim 2022. 8. 13.
728x90

Intent란?

 

[Android] 안드로이드 컴포넌트(구성 요소)

안드로이드 앱 개발의 핵심은 컴포넌트이다. 종종 "액티비티 컴포넌트", "서비스 컴포넌트" 등 컴포넌트라는 용어가 자주 등장한다. 그렇다면 컴포넌트란 무엇일까? 컴포넌트란? 컴포넌트는 안

jjunsu.tistory.com

위의 글에서 안드로이드는 컴포넌트로 구성되어 있고, 이 컴포넌트에는 4가지 유형이 있다는 것을 공부했다.

이 4가지 유형이 어떤 것들인지 다시 한번 되짚어 보면 다음과 같다.

  • Activity(액티비티)
  • Service(서비스)
  • Broadcast Receiver(브로드캐스트 리시버)
  • Content Provider(콘텐츠 제공자)

이를 왜 다시 되짚어 봤을까?

바로 Intent가 각각의 컴포넌트 간의 통신을 맡고 있기 때문이다.

 

즉, Intent는 컴포넌트 간의 작업 수행을 위한 데이터를 전달하는 역할을 하는 것이다.

Intent의 유형

Intent에는 두 가지의 유형이 있다.

  • 명시적 Intent
  • 암시적 Intent

명시적 Intent

명시적 Intent는 호출할 대상을 명확하게 알 수 있는 경우를 뜻한다.

즉, 인텐트에  충족하는 애플리케이션이 무엇인지 클래스 객체 또는 컴포넌트명을 지정하여 호출될 대상을 확실히 알 수 있다는 것이다.

가장 흔하게 볼 수 있는 예시로는 화면 전환을 하는 방법이다.

하나의 액티비티에서 다른 액티비티로 화면을 전환할 때, 다음과 같이 쓰인다.

val intent = Intent(this, SubActivity::class.java)
startActivity(intent)

코드에서 this에는 현재 컴포넌트의 정보를 가지고 있고, SubActivity는 호출할 컴포넌트의 정보를 가지고 있다.

startActivity를 통해 인텐트 객체인 intent를 파라미터로 넘겨주면, 현재 액티비티에서 SubActivity로 화면이 전환되게 된다.

startActivity()는 새로 변경된 컴포넌트로부터 새로운 데이터를 받을 필요 없을 때 사용된다. 즉, 단방향 통신에 사용된다.

 

변환된 컴포넌트에서 데이터를 받아와야 하는 쌍방향 통신이 필요하다면 어떻게 해야 할까?

이 때는 startActivity()가 아닌, registerForActivityResult()를 사용한다.

사용법은 다음과 같다.

// MainActivity
private lateinit var resultLauncher: ActivityResultLauncher<Intent>

getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    if(it.resultCode == RESULT_OK) {
        // 수행할 내용
    }
}

val intent = Intent(this, SubActivity::class.java)
getResult.launch(intent)
// SubActivity
val intent = Intent(this, MainActivity::class.java).apply {
    // 수행할 내용
}

setResult(RESULT_OK, intent)

registerForActivityResult()는 ActivityResultContracts와 ActivityResultCallback을 가져와 다른 컴포넌트를 실행하는 데 사용할 ActivityResultLauncher를 반환한다.

SubActivity의 활동이 종료되면 setResult()를 통해 호출자에게 반환할 결과를 설정한다.

MainActivity에서 resultCode가 SubActivity의 setResult에서 설정한 값과 같다면, SubActivity에서 반환된 값을 이용한 활동이 계속된다.

setResult에는 RESULT_OK 뿐만 아니라 원하는 정수를 사용해도 된다.

암시적 Intent

암시적 Intent는 호출할 대상을 지정하지 않고, Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com"))
startActivity(intent)

이와 같은 코드가 있다고 하자.

코드를 보면 "아! 구글 사이트를 여는 코드구나!"라는 것을 알 수 있다.

우리의 핸드폰을 보면 크롬뿐만 아니라 기본 브라우저, 네이버 어플 등등 다양한 애플리케이션이 존재한다.

이 중 기본 브라우저 설정이 돼있지 않다면, 저 코드는 어떤 애플리케이션으로 열어야 할지 사용자에게 물어보게 된다.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("tel: 010-1234-5678"))
startActivity(intent)

위의 코드는 "아 전화 창으로 가지겠구나!"를 알 수 있을 것이다.

실제로 실행시켜보면 다음처럼 된다.

이처럼 암시적 Intent는 호출할 대상이 명확히 돼있지 않고, 어떠한 데이터를 주느냐에 따라 결정된다.

Intent를 이용한 화면 전환

공부를 할 겸 간단하게 만들어보았다.

COUNT 버튼: 숫자 증가

RANDOM 버튼: 화면이 전환되며 0 ~ 현재 값 사이의 랜덤한 값이 출력된다.

뒤로 가기를 했을 때 랜덤 값부터 시작하여 카운트를 증가시킬 수 있도록 한다.

 

즉, 화면을 전환하면서 현재 값을 SubActivity로 전달해야 하고, SubActivity에서 MainActivity로 랜덤 값을 전달해야 하는 쌍방향 통신이 필요하다. 따라서 registerForActivityResult()를 사용한다.

 

GitHub - junsu1023/Android-Study

Contribute to junsu1023/Android-Study development by creating an account on GitHub.

github.com

전체적인 코드는 위 깃허브를 확인하면 된다.

결과

 

 

728x90

댓글