ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] 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에서는 registerForActivityResultActivityResultLauncher를 등록하여

    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
    }
Designed by Tistory.