인텐트

k_hyun·2023년 3월 1일
0

인텐트

컴포넌트를 실행하려고 시스템에 전달하는 메시지
기능을 수행하는 함수를 제공하는 클래스가 아닌 데이터를 담는 클래스이다.
원하는 컴포넌트를 수행할 때 사용된다.

인텐트를 통한 액티비티 전환

// 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를 사용하는 것이 권장된다.

0개의 댓글