Intent
컴포넌트를 실행하기 위해 시스템에 전달하는 메시지 객체로 기능을 수행하는 함수를 제공하지 않고 데이터를 담는 클래스이다. 이 객체를 통해 다른 컴포넌트 간에 정보를 주고받을 수 있다. (컴포넌트 간의 통신을 맡고 있음) 또한, 인텐트는 앱 내에서 메시지를 전달함에 그치지 않고 외부 앱의 컴포넌트와 연동할 때도 사용한다.
안드로이드의 컴포넌트 클래스는 시스템에서 라이프사이클을 관리하기 때문에 개발자가 코드에서 직접 생성해 실행할 수 없다. 이에 컴포넌트를 실행하기 위해서는 Intent를 시스템에 전달하여 시스템에서 컴포넌트를 실행해야 한다. 액티비티 등 안드로이드 컴포넌트를 manifest에 등록하는 것도 Intent가 시스템에 요청하여 해당 컴포넌트를 실행하기 때문이다. 인텐트가 주로 사용되는 곳은 액티비티 시작, 서비스 시작, 브로드캐스트 전달 등이 있다.
Intent 종류
인텐트에는 명시적 인텐트(Explicit Intents)와 암시적 인텐트(Implicit Intents)가 존재한다.
명시적 인텐트: class type reference 정보를 활용한 인텐트이다. 주로 애플리케이션 내부에서 사용하며, 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용한다. Manifest 파일의 <activity> 태그 내에 액티비티 클래스명만 등록시켰을 때 클래스명을 사용하여 액티비티를 실행한다.
<activity android:name=".OneActivity"></activity>
암시적 인텐트: 인텐트 필터와 연관이 있는 인텐트이다. 암시적 인텐트를 호출한 액티비티로부터 안드로이드 시스템이 인텐트 객체를 전달받아 실행할 수 있는 액티비티 탐색 후 조건에 맞는 액티비티를 실행한다. 호출할 대상이 달라질 수 있는 경우에는 암시적 인텐트를 사용한다. 인텐트 메커니즘을 통해 외부 애플리케이션과 연동할 때 사용하는데, 외부 앱의 컴포넌트는 클래스 타입 레퍼런스를 사용할 수 없기 때문에 매니페스트 파일에 선언된 인텐트 필터를 이용하여 속성을 지정한 뒤 코드로 호출한다.
<activity android:name=".TwoActivity">
<intent-filter>
<action android:name="ACTION_EDIT"/>
</intent-filter>
</activity>

- 액티비티 A가 작업 설명이 있는 Intent를 생성하여 이를 startActivity()에 전달
- Android 시스템이 모든 앱에서 해당 인텐트와 일치하는 인텐트 필터를 검색
- 일치하는 항목을 찾으면, 시스템이 해당 액티비티의 onCreate() 메서드를 호출하여 이를 Intent에 전달하고, 일치하는 액티비티(액티비티 B)를 시작
인텐트 필터(Intent Filter): 매니페스트 파일에 정의하는 태그 집합이다. 해당 컴포넌트가 수신하고자 하는 인텐트의 유형을 표현한다. 인텐트 필터 정의 시 인텐트 구성요소를 사용한다. 시스템은 정의된 인텐트 필터들 중 통과되는 경우가 있을 때만 암시적 인텐트를 앱 컴포넌트에 전달한다.
<action> : 컴포넌트의 능력을 표현하는 문자열
<category> : 컴포넌트가 어느 법주에 포함되어야 하는지의 문자열
<data> : 컴포넌트에서 필요한 데이터의 정보
(각각을 모두 사용해야 하는 것은 아님)
// 인텐트 필터 정의
<activity android:name=".TwoActivity">
<intent-filter>
<action android:name="ACTION_EDIT"/>
</intent-filter>
</activity>
// 암시적 인텐트 사용
val intent = Intent()
intent.action="ACTION_EDIT"
intent.data=Uri.parse("http://www.google.com")
startActivity(intent)
화면 전환에서의 Intent 사용
Activity 실행
startActivity() : 액티비티를 실행시키기 위한 인텐트를 발생
val intent = Intent(this, DetailActivity::class.java) // 컴포넌트 실행 대상이 되는 객체. 실행 대상이 되는 컴포넌트의 정보를 매개변수로 줌
startActivity(intent)
Extra Data
한 컴포넌트에서 인텐트로 다른 컴포넌트를 실행시킬 때 넘겨야 할 데이터로 인텐트에 담기는 데이터이다. 인텐트에 데이터를 담을 때 Extra 함수를 사용한다.
// 데이터를 보내는 액티비티
intent.putExtra("id", i)
intent.putExtra("tittle", datas[i])
// 데이터를 받는 액티비티
val intent = Intent // 자기자신을 실행시키는 인텐트 객체
/* 이후 인텐트 객체에 다음 함수들을 이용하여 데이터를 받을 수 있음
getIntExtra()
getStringExtra()
getDoubleExtra()
*/
val id = intent.getIntExtra("id", 0)
val title = intent.getStringExtra("title")
Activity Result
액티비티를 실행시키고 되돌아왔을 때 되돌려 받는 데이터로 되돌아와서 사후처리가 필요한 데이터가 존재할 때 사용한다. 인텐트로 액티비티를 실행시키고 결과를 되돌려 받는 방법은 아래 두 가지 존재한다.
startActivityForResult() 함수를 이용하는 방법 → 현재 deprecation 됨
ActivityResultLauncher() 함수를 이용하는 방법 → 11 버전에서부터 제공됨
// startActivityForResult() 함수를 이용
val intent : Intent = Intent(this, DetailActivity::class.java)
startActivityForResult(intent, 10)
// 되돌아온 액티비티에서 아래 함수가 자동 콜 됨. 이 함수 안에서 사후처리 작업을 함
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// requestCode로 사후처리 경우를 나눔, resultCode로 요청 처리 상태를 확인
if(requestCode==10 && resultCode==RESULT_OK) {
}
}
// ActivityResultLauncher() 함수를 이용하는 방법
// 액티비티를 실행시키고 결과를 획득 퍼미션 조정 결과 획득
val activityResultLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult() {
// 결과가 되돌아 왔을 때 StartActivityForResult 함수 안에서 사후처리 작업을 함
}
}
val intent = Intent(this, DetailActivity::class.java)
activityResultLauncher.launch(intent) // launch() 함수를 이용하여 인텐트를 실행
Reference