์๋๋ก์ด๋๋ intent ๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ์ฑ์ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ํธ์ถํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์ ์๋ค. ์ด๋ ๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ๋ฐ ์ฌ์ฉํ๋ ํจ์์ธ startActivityForResult์ onActivityResult๋ ํธ๋ฆฌํด ๋ณด์ด์ง๋ง, ์ฌ๋ฌ ๊ฐ์ง ํจ์ ์ ๊ฐ์ง๊ณ ์์๋ค. ์ด ๊ธ์์ ์๋ก์ด ํ์ค์ด ๋ Activity Result API์ ActivityResultContract์ ๋ํด ๊น์ด ํํค์ณ ๋ณด๊ณ , ์ฌ์ฉ ์ ์ฃผ์ํ ์ ๊น์ง ํจ๊ป ์์๋ณด๊ฒ ๋ค.
ActivityResultContract ์๊ฐ
ActivityResultContract ๋ ๋ค๋ฅธ ์กํฐ๋นํฐ๋ฅผ ์คํํ๊ณ , ๊ทธ๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ์์
์ ์ถ์ํํ ํด๋์ค๋ค. ์ด ํด๋์ค๋ ๋ ๊ฐ์ง ํ์
, ์ฆ ์
๋ ฅ(Input)๊ณผ ์ถ๋ ฅ(Output)์ ์ ๋ค๋ฆญ์ผ๋ก ๋ฐ๋๋ค. createIntent ๋ฉ์๋๋ฅผ ํตํด ์
๋ ฅ์ ๋ฐํ์ผ๋ก ์ธํ
ํธ๋ฅผ ์์ฑํ๊ณ , parseResult ๋ฉ์๋๋ฅผ ํตํด onActivityResult ์ฝ๋ฐฑ์ผ๋ก๋ถํฐ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ ํ์
์ผ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค.
๊ณผ๊ฑฐ์ ์ ์ฐ: onActivityResult
ActivityResultContract๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์๋ ๋ค๋ฅธ ์กํฐ๋นํฐ๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด startActivityForResult์ onActivityResult๋ฅผ ์ฌ์ฉํ๋ค.
Activity์์ onActivityResult ์ฌ์ฉํ๊ธฐ
class OldActivity : AppCompatActivity() {
val REQUEST_CODE = 123
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
val intent = Intent(this, OtherActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
}
}
์ด ๋ฐฉ์์ requestCode๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ถํด์ผ ํ๊ณ , onActivityResult ๋ฉ์๋ ๋ด๋ถ์ ๋ณต์กํ ์กฐ๊ฑด๋ฌธ์ด ์๊ธธ ์ ์๋ค๋ ๋จ์ ์ด ์์๋ค. ๋ํ, Activity ํด๋์ค์ ์ง์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ ๋ ํ
์คํธ๊ฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ๋ ์์๋ค.
Fragment์์ onActivityResult ์ฌ์ฉํ๊ธฐ
Fragment ์ญ์ onActivityResult๋ฅผ ์ฌ์ฉํ๋ค.
class OldFragment : Fragment() {
override fun onStart() {
super.onStart()
val intent = Intent(requireContext(), OtherActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
}
}
Fragment ์ญ์ Activity์ ๋ง์ฐฌ๊ฐ์ง๋ก onActivityResult๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด์ผ ํ์ผ๋ฉฐ, ์ด๋ ๋น์ทํ ๋จ์ ๋ค์ ์ผ๊ธฐํ๋ค.
ActivityResultContract์ ๋ด๋ถ ๋์: Registry๋ฅผ ํตํ ์ถ์ํ
๋ง์ ๊ฐ๋ฐ์๊ฐ ActivityResultContract๊ฐ ์์ ํ ์๋ก์ด ๋ฐฉ์์ผ๋ก ๋์ํ๋ค๊ณ ์๊ฐํ์ง๋ง, ์ฌ์ค ๋ด๋ถ์ ์ผ๋ก๋ ์ฌ์ ํ startActivityForResult์ onActivityResult๋ฅผ ์ฌ์ฉํ๋ค. ActivityResultContract๋ ์ด ๋ ๋ฉ์๋๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ํธ์ถํ๋ ๋์ , ActivityResultRegistry ๋ฅผ ํตํด ์ด๋ฅผ ์ถ์ํํ๊ณ ๊ด๋ฆฌํ๋ค.
ActivityResultRegistry๋ ์๋ช
์ฃผ๊ธฐ์ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ๋ฆฌ์ค๋์ ํค๋ฅผ ์ฌ์ฉํ๋ค. registerForActivityResult๋ฅผ ํธ์ถํ๋ฉด ๋ค์ ์ธ ๊ฐ์ง ๊ณผ์ ์ด ์งํ๋๋ค.
- ํค ์์ฑ:
ActivityResultRegistry๋ ๋ด๋ถ์ ์ผ๋ก ๊ณ ์ ํ ํค(์:"activity_rq#1")๋ฅผ ์์ฑํ๋ค. ์ฐธ๊ณ : ComponentActivity#registerForActivityResult - ๋ฆฌ์ค๋ ๋ฑ๋ก: ์ด ๊ณ ์ ํ ํค์ ํจ๊ป, ๊ฐ๋ฐ์๊ฐ ์ ๊ณตํ ์ฝ๋ฐฑ(
ActivityResultCallback)์ดActivityResultRegistry์ ๋ฑ๋ก๋๋ค. ์ฐธ๊ณ : ActivityResultRegistry#register
์ด์ ActivityResultLauncher์ launch ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ActivityResultRegistry๋ ์ค๋น๋ ์ธํ
ํธ๋ฅผ startActivityForResult๋ฅผ ์ด์ฉํด ์คํํ๋ค. ( ์ฐธ๊ณ : ComponentActivity.activityResultRegistry) ์กํฐ๋นํฐ๊ฐ ์ข
๋ฃ๋์ด ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ฉด, onActivityResult๋ฅผ ํตํด ์ ๋ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ActivityResultRegistry๊ฐ ๊ฐ๋ก์ฑ๋ค. (์ฐธ๊ณ : ComponentActivity#onActivityResult)
๋ง์ง๋ง์ผ๋ก, ActivityResultRegistry๋ ์ฒ์ ๋ฑ๋กํ๋ ๊ณ ์ ํ ํค๋ฅผ ์ด์ฉํด ๋ฑ๋ก๋ ์ฝ๋ฐฑ์ ์ฐพ์ onResult๋ฅผ ์คํํ๋ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ด ActivityResultContract ๋ค์ ์จ๊ฒจ์ ธ ์์ด ๊ฐ๋ฐ์๋ ๋ณต์กํ ์ฝ๋ฐฑ ์ฒ๋ฆฌ๋ฅผ ์ง์ ํ ํ์๊ฐ ์๋ค.
์ด ๊ณผ์ ์ sequence diagram ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ActivityResultContract ์ฌ์ฉ ์ ์ฃผ์ํ ์
ActivityResultContract๋ ๋ถ๋ช
๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์๋ชป ์ฌ์ฉํ๋ฉด ์์์น ๋ชปํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์๋ค. ๊ฐ์ฅ ์ค์ํ ์์น์ registerForActivityResult() ๋ ํญ์ ๊ฐ์ ์์๋ก ํธ์ถ๋์ด์ผ ํ๋ค๋ ์ ์ด๋ค.
Activity์์ ์ฌ์ฉํ ๋
Activity์์ registerForActivityResult๋ฅผ ํธ์ถํ ๋๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์ ์ ๋ฉค๋ฒ ๋ณ์๋ก ๋ฑ๋กํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
class NewActivity : AppCompatActivity() {
// ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ ์ด๊ธฐํ
private val someActivityResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
someActivityResultLauncher.launch(intent)
}
}
๋ง์ฝ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํธ์ถ ์์๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น? ์ด๋ฐ ์์ผ๋ก ์ง๋ฉด ์๋์ง๋ง ํ์ฌ๊ฐ ๋ค์ ์ฝ๋๋ฅผ ์์ํด๋ณด์.
class NewActivity : AppCompatActivity() {
lateinit var someActivityResultLauncher : ActivityResultLauncher<Intent>
lateinit var otherActivityResultLauncher : ActivityResultLauncher<Intent>
init {
val isAm = ZonedDateTime.now().hour < 12
if( isAm) {
someActivityResultLauncher = registerForActivityResult(..) { }
otherActivityResultLauncher = registerForActivityResult(...) { }
} else {
otherActivityResultLauncher = registerForActivityResult(...) { }
someActivityResultLauncher = registerForActivityResult(...) { }
}
}
}
์ค์ ์ ์กํฐ๋นํฐ๊ฐ ์์ฑ๋์ด some > other ์์ผ๋ก register ๋์๋ค. ์ด ๊ฒฝ์ฐ some ์ ๋ด๋ถ key๋ activity_req#0, other ๋ activity_req#1 ์ด ๋๋ค. some ์ launch ํด์ ๋ค๋ฅธ OtherActivity ๊ฐ ํธ์ถ๋์๋ค. ๊ทธ ์ฌ์ด์ ์คํ๊ฐ ๋์๋ค. ๊ทธ ์ฌ์ด์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ํ์ ํด์ NewActivity ๋ ์ฌ์์ฑ๋์ด์ผ ํ๋ค. ์ด์ OtherActivity๊ฐ ์ฌ์์ฑ๋๋ฉด์ ๊ฒฐ๊ณผ๊ฐ์ด ์ ๋ฌ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฒ์ other ๊ฐ #0, some ์ด #1 ์ด ๋์ด๋ฒ๋ ธ๋ค. ๊ฒฐ๊ตญ some ์ callback ์ด ํธ์ถ๋์ด์ผ ํ๋๋ฐ, ์๋ฑํ๊ฒ other ์ callback ์ด ํธ์ถ๋์ด ๋ฒ๋ฆฐ๋ค. ๋ง์ฝ ๋ callback ์ ์ธ์ ํ์
์ด ๋ค๋ฅผ ๊ฒฝ์ฐ์ class cast exception ์ด ๋ ์๋ ์๊ณ , ์๋๋ฉด ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์๋ฑํ ์ผ์ด ๋ฒ์ด์ง ์ ์๋ค.
์ฌ๊ธฐ์ ์๋ฌธ์ด ํ๊ฐ์ง ๋ค ์ ์๋ค. startActivityForResult() ์ ์ ๋ฌ๋๋ request code ๋ ๋๋คํ๊ฒ ์์ฑ๋๋๋ฐ, ์กํฐ๋นํฐ๊ฐ ์ฌ์์ฑ๋์์ ๋ onActivityResult ์์ ์ด์ request code ๋ฅผ ์ด๋ป๊ฒ ์๊ณ callback ์ ํธ์ถํ๋๊ฑธ๊น? ์ด ๋ถ๋ถ์ ActivityResultRegistry ๊ฐ ์ฌ์์ฑ ์ ๋ณต๊ตฌ๋๋ฉด์ ๊ธฐ์กด ๋ด๋ถ key ์ request code ๊ฐ ๋งคํ์ ๋ณต๊ตฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ.
ActivityResultRegistry ๋ ๋ด๋ถ์ ์ผ๋ก launcher ๋ค์ ๋ถ์ฌ๋ key ๋ฅผ Int ํ์
์ธ request code ๋ก ๋ฐํํ๋ ํ
์ด๋ธ์ ๊ฐ๊ณ ์์ผ๋ฉฐ ( ์ฐธ๊ณ : ActivityResultRegistiry#bindRcKey) , ์กํฐ๋นํฐ๊ฐ ์ฌ์์ฑ๋ ๋ ์ด ํ
์ด๋ธ์ ๋ณต๊ตฌํ๋ค. ๋ฐ๋ผ์ ์กํฐ๋นํฐ๊ฐ ์ฌ์์ฑ๋์ด๋ ์ด์ ์ ํธ์ถํ๋ request code ๋ฅผ ๊ฐ์ง๊ณ ์ด๋ค ์ฝ๋ฐฑ์ ํธ์ถํด์ผ ํ ์ง ์ ์์๋ผ ์ ์๋ค. ( ์ฐธ๊ณ : ActivityResultRegistry#onRestoreInstanceState)
Fragment์์ ์ฌ์ฉํ ๋
Fragment ์ญ์ Activity์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ถ๊ฐ์ ์ผ๋ก Fragment๊ฐ destroy๋ ํ ๋ค์ create๋ ๋, ์ด์ ์ ๋ฑ๋กํ๋ ์ฝ๋ฐฑ ์ ๋ณด๊ฐ ์ฌ๋ผ์ ธ ์ฝ๋ฐฑ์ด ์ ๋๋ก ์ ๋ฌ๋์ง ์์ ์ ์๋ค. ์ด๋ Fragment๊ฐ destroy๋ ๋ ActivityResultRegistry์ ๋ฑ๋ก๋ ์ ๋ณด๊ฐ ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
lifecycleOwner ๊ฐ DESTROY ๋ ๋ ๋ฑ๋ก๋ contract, callback ์ unregister ํ๋ ๋์์ ์ด์ฐจํผ ActivityResultRegistry๊ฐ ์ํํ๊ธฐ ๋๋ฌธ์ Activity ๋ Fragment ๋ ๋์ผํ๋ค. ํ์ง๋ง ๋๋ ํ๋ฒ destroy ๋ Activity ์ธ์คํด์ค๊ฐ ๋ค์ create ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์ง ๋ชปํ๋๋ฐ, Fragment ์์ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ข
์ข
๋ดค๋ค. ๋ฐ๋ผ์, Activity ์์ ๊ฐ์ฒด ์ด๊ธฐํ ์ register ๋ฅผ ๊ถ์ฅํ์ง๋ง Fragment ์์ ์คํ๋ ค onCreate ์์ register ๋ฅผ ๊ถ์ฅํ๋ค. ์ด๋์ผ destroy ํ re-create ์ ๋ค์ ActivityResultRegistry ์ Launcher๊ฐ ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ Fragment ์ธ์คํด์ค ์ด๊ธฐํ ์์ ๋ณด๋ค๋ onCreate ์ฝ๋ฐฑ ๋ด์์ registerForActivityResult๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ์์ ํ๋ค.
class NewFragment : Fragment() {
private lateinit var someActivityResultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Fragment๊ฐ ์ฌ์์ฑ๋ ๋๋ง๋ค ์ฝ๋ฐฑ์ด ๋ค์ ๋ฑ๋ก๋๋๋ก ๋ณด์ฅ
someActivityResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
}
fun someButtonClick() {
someActivityResultLauncher.launch(Intent(requireContext(), OtherActivity::class.java))
}
}
Composable์์ ์ฌ์ฉํ ๋
Jetpack Compose์์๋ rememberLauncherForActivityResult ๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํจ์ ์ญ์ ๋ด๋ถ์ ์ผ๋ก activityResultRegistry.register๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, Activity ๋ Fragment ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
@Composable
fun MyScreen() {
val someActivityResultLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult(),
onResult = { result ->
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
)
Button(onClick = {
someActivityResultLauncher.launch(Intent(context, OtherActivity::class.java))
}) {
Text("Launch Activity")
}
}
๋ค๋ง ๋ด๋ถ key ๊ฐ UUID.randomUUID().toString() ๋ผ์, Activity ์์ activity_req#1 ์ ๊ฐ์ ํํ๋ก ๋ฑ๋ก ์์์ ์ํฅ์ ๋ฐ๋๊ฒ ์๋, ๋๋คํ ๊ณ ์ ๊ฐ์ด ๋ถ์ฌ๋๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
rememberLauncherForActivityResult๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์กฐ๊ฑด๋ฌธ ์์ ๋ฑ๋กํ๋ฉด ์ ๋๋ค. remember๊ฐ ์๋ ํจ์๋ ์ปดํฌ์ ๋ธ์ ์ฌ๊ตฌ์ฑ(recomposition) ๊ณผ์ ์์ remember์ ํค๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ํธ์ถ๋์ง ์์ ๊ฒฝ์ฐ, ์ธ์คํด์ค๊ฐ ์๋กญ๊ฒ ์์ฑ๋๊ฑฐ๋ ์์ ์์ฑ๋์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ, rememberLauncherForActivityResult๋ ๊ฐ๊ธ์ ์ต์์ ์ปดํฌ์ ๋ธ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ํ์ ์ปดํฌ์ ๋ธ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์์ ์ปดํฌ์ ๋ธ์ ์ํ ๋ณํ๋ ์กฐ๊ฑด๋ฌธ์ ๋ฐ๋ผ ์ปดํฌ์ ๋ธ์ ์์น ๋ฑ์ด ๋ฐ๋ ๊ฒฝ์ฐ ์กํฐ๋นํฐ ์ฌ์์ฑ ์ ๋ค๋ฅธ composable ๋ก ์ธ์๋์ด ์ด์ composable ์ ๋ณต๊ตฌ๊ฐ ์ด๋ค์ง์ง ์๋๋ค๋ฉด ๊ฒฐ๊ณผ ์ฝ๋ฐฑ์ด ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์บก์ํ ๊ด์ ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ ํ๋ composable ๋ด๋ถ์ rememberLauncherForActivityResult ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐธ ํธ๋ฆฌํ๊ฒ ์ง๋ง, ํด๋น composable ์ด ์ด๋ค ๋งฅ๋ฝ์์, ์ด๋ค ๊ฒฝ์ฐ์ ํธ์ถ๋๋์ง ํต์ฌํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ตฌํํ๋ ๊ฑด ์ํํ ์ ์๋ค. ์๋ฅผ๋ค์ด ๊ฒ์ํ์ ๋ง๋๋๋ฐ ๋๊ธ composable ์ ์ด๋ฏธ์ง ์ฒจ๋ถ๋ฅผ ์ํด ๊ฐค๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ๊ธฐ๋ฅ๊น์ง ๋ฃ์ด๋๋ฉด ์ฐธ ๋ฉ์ง ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ์ด ๋๊ธ composable ์ด ์ด๋ค ์์ผ๋ก ํธ์ถ๋ ์ง composable ์์ฑ์๊ฐ ์ปจํธ๋กค ํ ์ ์๊ณ , ์ด๋ฌ๋ค๋ณด๋ฉด ์กํฐ๋นํฐ ์ฌ์์ฑ ์ ํธ์ถ ์์น๊ฐ ๋ฐ๋์ด๋ฒ๋ฆด ๊ฒฝ์ฐ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๋ฐ๋๋ก composable ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ์
์ฅ์์๋ ์ด composable์ ์ฌ์ฉํ๋๋ฐ ์ด๋ค ์ฃผ์์ฌํญ์ด ์๋์ง ์ผ์ผ์ด ํ์
ํ๊ธฐ๊ฐ ์ฝ์ง ์์, ์ด๋ฐ ๊ฒฝ์ฐ ์ ์ด์ rememberLauncherForActivityResult ๋ฅผ ์์ฐ๋๊ฒ ๋ซ๋ค.
๋ฐ๋ผ์ ๊ฐ๊ธ์ ์ต์์ composable ์๋ง ์ฌ์ฉํ๋๊ฒ ์ ์ง๋ณด์ ๊ด์ ์์ ๋ ๋์ ์ ํ์ด ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
๋งบ์๋ง
ActivityResultContract๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ณ , ํ์
์์ ์ฑ์ ์ ๊ณตํ๋ฉฐ, ํ
์คํธ ์ฉ์ด์ฑ์ ๋์ฌ์ค๋ค. ํ์ง๋ง ์ฃผ์๊น๊ฒ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ด์๋์์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ ์๊ณ ์ฌ์ฉํด์ผ ํ๋ค.

Top comments (2)
์ข์ ์ ๋ฆฌ์ ๋๋ค! ์ฐธ๊ณ ๋ก AndroidX Fragment 1.3.0๋ถํฐ Fragment์ startActivityForResult/onActivityResult๋ deprecated์ด๊ณ , Compose์ rememberLauncherForActivityResult๋ ๋ด๋ถ ํค๋ฅผ UUID๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ requestCode๋ ๋ก๋ ๋ฒํธ์ฒ๋ผ ์์ด๋ ๋์ง๋ง, register ์์๊ฐ ๋ฐ๋๋ฉด ์ฝ๋ฐฑ๋ ์นดํ์ธ ๋์ ๋ฒ๊ทธ๋ฅผ ๋๋ฆฝํด์ :)
๋ค, ๋ง์ต๋๋ค. register ์์๋ ๊ผญ ์ง์ผ์ผํ์ง์.