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 콜백입니다.
  • ActivityResultCaller.registerForActivityResult
    • 타입 변환을 수행하지 않는 ActivityResultContract입니다.
    • requestCode를 관리할 필요가 없는 상황에 사용합니다.

 

 

 

 

출처

https://developer.android.com/reference/androidx/activity/result/contract/ActivityResultContract?_gl=1*144xche*_up*MQ..*_ga*MTAwMTE4NDE5NC4xNzQ4MzI1MTIz*_ga_6HH9YJMN9M*czE3NDgzMjUxMjIkbzEkZzAkdDE3NDgzMjUxMjIkajAkbDAkaDE5MjE3Mzg2MDUkZENuZ09BQWhpcmxhVmNJUWg4elV4YVYtVjEyTzBDdl9xOVE.

 

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