android/Kotlin
[안드로이드] startActivity
코코넛딩
2025. 5. 27. 16:37
val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
// 결과 처리
}
}
launcher.launch(Intent(this, AnotherActivity::class.java))
1. startActivity()
public void startActivity (Intent intent, Bundle options)
- 새로운 액티비티를 시작하는데 사용됩니다.
- options 매개 변수를 사용하여, 실행할 액티비티에 정보를 제공한다.
- option 값은 null이 될 수 있다.
val intent = Intent(this, TestActivity::class.java)
startActivity(intent)
2. startActivityForResult()
public void startActivityForResult (Intent intent, int requestCode, Bundle options)
- 다른 액티비티를 시작하고, 그 액티비티가 종료될 때 결과를 받기 위해 사용됩니다.
- 이 메서드를 사용하면, 시작된 액티비티가 종료될 때 onActivityResult()가 호출되어 결과를 받을 수 있습니다.
- requestCode는 어떤 요청의 결과값인지 구별하는 코드입니다.
- 0 이상의 값을 사용합니다.
- 음수 값을 사용하면 startActivity()를 호출한 것과 동일합니다. 결과를 가져오지 않습니다.
- 결과를 반환하지 않는 인텐트(Intent.ACTION_MAIN, Intent.ACTION_VIEW)를 사용할 경우 기대한 결과를 받지 못할 수 있습니다.
- FLAG_ACTIVITY_NEW_TASK 플래그 사용시 주의 사항
- 시작하려는 액티비티가 FLAG_ACTIVITY_NEW_TASK 플래그를 사용하는 경우, 해당 액티비티는 호출자의 태스크가 아닌 새로운 태스크에서 실행되므로, 결과를 받지 못하고 즉시 취소 결과를 받을 수 있습니다.
- onCreate() 또는 onResume() 중 호출 시 주의사항
- 액티비티의 onCreate() 또는 onResume() 메서드에서 requestCode가 0 이상인 상태로 startActivityForResult()를 호출하면, 새로운 액티비티로 부터 결과를 받을 때까지 현재 액티비티의 창이 표시되지 않을 수 있다. 다른 액티비티로의 전환 시 깜빡임 현상을 방지하기 위한 것이다.
3. registerForActivityResult
abstract @NonNull ActivityResultLauncher<@NonNull I> <I extends Object, O extends Object> registerForActivityResult(
@NonNull ActivityResultContract<@NonNull I, @NonNull O> contract,
@NonNull ActivityResultCallback<@NonNull O> callback
)
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
private fun setResultSignUp(){
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK){
val id = result.data?.getStringExtra("id") ?: ""
val password = result.data?.getStringExtra("password")?:""
binding.etId.setText(id)
binding.etPassword.setText(password)
}
}
}
- startActivityForResult() 및 onActivityResult() API는 모든 API 수준의 Activity에서 사용할 수 있지만 Activity Result API는 Activity 및 Fragment 클래스에서 사용할 수 있습니다.
- Activity Result API는 결과를 등록하기 위한 구성요소를 제공합니다.
- 결과를 생성하는 액티비티를 시작하고 결과가 나오면 처리합니다.
- 결과를 위한 액티비티를 시작할 때 메모리 부족으로 프로세스와 액티비티가 소멸될 수 있습니다.
- 특히 카메라와 같이 메모리를 많이 사용하는 경우에는 소멸될 확률이 매우 높습니다.
- 따라서, Activity Result API는 다른 액티비티를 실행하는 코드 위치에서 결과 콜백을 분리합니다.
- 결과 콜백은 새로 실행할 액티비티가 생성될 때마다 등록되야 합니다.
- ComponentActivity 또는 Fragment에 있을 때, Activity Result API에서 제공하는 registerForActivityResult() API를 통해 결과 콜백을 등록할 수 있습니다.
- registerForActivityResult() 의 인자로 ActivityResultContract 및 ActivityResultCallback을 가져와서 다른 액티비티를 실행하는 데 사용할 ActivityResultLauncher를 반환합니다.
- ActivityResultContract
- 액티비티 간의 결과 전달을 type-safe 처리할 수 있도록 도와주는 클래스입니다.
- 즉, 액티비티를 시작할 때 필요한 입력과, 그로부터 받을 결과의 타입을 명확하게 정의하여, 컴파일 시점에 타입 검사를 통해 오류를 방지할 수 있습니다.
- ActivityResultCallback
- 액티비티에서 받아온 결과가 사용가능할 때 호출되는 type-safe 콜백입니다.
- ActivityResultContract
- ActivityResultCaller.registerForActivityResult
- 타입 변환을 수행하지 않는 ActivityResultContract입니다.
- requestCode를 관리할 필요가 없는 상황에 사용합니다.
출처
ActivityResultContract | API reference | Android Developers
androidx.appsearch.builtintypes.properties
developer.android.com
https://velog.io/@ho-taek/Android-registerForActivityResult%EB%9E%80
[Android] registerForActivityResult()란?
! 기존에 데이터 주고 받을 때 사용했던 startActivityForResult()가 derpecated 됐고, 다른 방법을 찾아보다가 registerForActivityResult()에 대해 알게 되었다!! 그 사용법에 대해 간단하게 알아보자 <img src =h
velog.io