컴포넌트를 실행하려고 시스템에 전달하는 메시지
기능을 수행하는 함수를 제공하는 클래스가 아닌 데이터를 담는 클래스이다.
원하는 컴포넌트를 수행할 때 사용된다.
// MainActivity에서 DetailActivity를 실행
val intent: Intent = Intent(this, DetailActivity::class.java)
// 엑스트라 데이터 추가
intent.putExtra("data1", 1)
startActivity(intent)
// DetailActivity에서는 넘어온 data1을 활용할 수 있다.
val data1 = intent.getIntExtra("data1")
사후 처리가 필요없을 때는 startActivity함수를 사용한다.
사후 처리가 필요한 액티비티 화면을 되돌리는 데는 두 방식이 있다.
startActivityForResult 그리고 ActivityResultLauncher가 있다.
최근에는 ActivityResultLauncher를 권장하고 있으므로 이 방식에 대해 알아보겠다.
val requestLauncher: ActivityResultLauncher<Intent>
= registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) // Contract 객체
{
// Callback 함수 작성
}
registerForActivityResult 함수에는 Contract와 Callback 객체를 등록해야 한다.
val intent: Intent = Intent(this, DetailActivity::class.java)
requestLauncher.launch(intent)
ActivityResultLauncher객체를 launch()함수로 실행해 주면 된다.
val intent: Intent = Intent(this, DetailActivity::class.java)
지금까지는 위의 방식으로 인텐트에 컴포넌트 정보를 지정하였다.
이런 방식을 명시적 인텐트라고 한다.
내부앱의 컴포넌트를 요청하는 인텐트 객체를 만들 때 사용한다.
하지만 외부 앱의 컴포넌트는 클래스 타입 레퍼런스를 활용할 수 없기에 암시적 인텐트를 이용한다.
<activity android:name=".OneActivity" />
<activity android:name=".TwoActivity"
android:exported="true">
<intent-filter>
<action android:name="ACTION_EDIT" />
</intent-filter>
</activity>
인텐트 필터 하위에는 action, category, data 태그를 이용해 정보를 설정할 수 있다.
action - 컴포넌트의 기능을 나타내는 문자열
category - 컴포넌트가 포함되는 범주를 나타내는 문자열
data - 컴포넌트에 필요한 데이터 정보
암시적 인텐트는 실행할 액티비티가 없거나 여러개 일 수 있다.
없는 경우는 오류가 발생하며 없는 상황을 고려해 예외 처리를 해준다.
val intent = Intent("ACTION_HELLO")
try {
startActivity(intent)
} catch (e: Exception) {
...예외처리
}
여러개인 경우 사용자 선택 또는 패키지 지정으로 으로 하나만 실행 가능하다.
val intent = Intent(...)
// 패키지명 지정
intent.setPackage("com.google.android.apps.maps")
startActivity(intent)
안드로이드 11 버전부터는 앱의 패키지 공개 상태를 지정하지 않으면 외부 앱의 패키지 정보에 접근할 수 없게 되었다.
매니페스트 파일에 외부 앱의 정보에 접근하겠다고 선언해 줘야 한다.
<queries>
<package android:name="com.example.test" />
</queries>
queries 하위에 여러개의 패키지 명을 선언할 수 있지만 uses-permission을 선언할 수도 있다.
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
queries를 사용하는 것이 권장된다.