-
[안드로이드] registerForActivityResult란?카테고리 없음 2024. 3. 21. 09:54
registerForActivityResult
registerForActivityResult는 기존
startActivityForResult의 대체 구문으로액티비티로부터 결과 값을 받고 싶을 때 사용한다.
(startActivityForResult가 deprecated 되었는데 그 이유가 새롭게 연 액티비티에서
메모리를 많이 사용할 경우 이전에 열려있던 액티비티가 죽어서 콜백을 제대로 받지 못하는 경우가 있다고 한다.)
registerForActivityResult와
startActivityForResult의 차이점Main 액티비티와 Test 액티비티가 있다고 가정해보겠다.
startActivityForResult[with onActivityResult]
1. Main에서 Test를 실행했는데 메모리가 부족하여 Main이 소멸됨
2. Test 종료 후 setResult()로 결과 값을 넘김
3. Main이 소멸됐다가 생성되었기 때문에 Test의 결과 값을 받지 못함- registerForActivityResult[with ActivityResultLauncher]
1. Main에서 Test를 실행했는데 메모리가 부족하여 Main이 소멸됨
2. Test 종료 후 setResult()로 결과 값을 넘김
3. Main이 소멸 후 생성되어도 registerForActivityResult가 콜백을 다시 등록해주기 때문에 결과 값을 받을 수 있음.
registerForActivityResult 사용법
Main에서는 registerForActivityResult로 ActivityResultLauncher를 등록하여
resultLauncher.launch(intent)로 Test를 실행한다.
Test에서는 setResult(Code.RESULT_CODE, intent)로 결과 값을 넘겨줄 수 있다.
(setResult에서 resultCode를 넘길 수 있는데 이를 통해 어디서 데이터가 왔는지 판별한다.)
class MainActivity : AppCompatActivity() { private val resultLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> // resultCode를 통해 어디서 데이터가 왔는지 판별한다. if (result.resultCode != Code.RESULT_CODE) return@registerForActivityResult val intent = result.data ?: return@registerForActivityResult val id = intent.getStringExtra("id") ?: return@registerForActivityResult val password = intent.getStringExtra("password") ?: return@registerForActivityResult Toast.makeText(this, "입력: $id, $password", Toast.LENGTH_SHORT).show() // 입력: test, test1234 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val intent = Intent(this, TestActivity::class.java) resultLauncher.launch(intent) } } class TestActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) val intent = Intent(this, MainActivity::class.java).apply { putExtra("id", "test") putExtra("password", "test1234") } setResult(Code.RESULT_CODE, intent) finish() } } object Code { const val RESULT_CODE = 1 }