티스토리 뷰

728x90

 

 

 

기존 방식 - startActivityForResult

먼저 activity간 데이터를 전달하는 기존 방식을 알아보자.

자세히 말하면 새로운 activity로 이동하고, 그 activity가 닫힐 때 결과를 받아오는 것이다.

 

 

1. 데이터를 받을 activity에서 새로운 activity 시작 (MainActivity.kt)

	startActivityForResult(Intent(this, SubActivity::class.java), REQUEST_CODE)

기존 activity의 코드는 위와 같다.

이동하려는 activity를 Intent에 담아서 startActivityForResult()를 호출한다.

결과를 받아오지 않고 그냥 activity를 실행하려면 startActivity()를 사용했지만, 결과까지 받아오려면 startActivityForResult()를 호출한다.

이 때 결과를 요청하는 activity를 구분하기 위한 REQUEST_CODE를 인자로 전달한다.

 

 

2. 새로운 activity를 종료할 때 기존 activity에 데이터 전달 (SubActivity.kt)

    setResult(RESULT_OK, Intent().apply {
    	putExtra("RESULT_KEY1", "test1")
        putExtra("RESULT_KEY2", "test2")
    }) // RESULT_CANCELED도 가능
    
    finish()

setResult() 함수를 통해 기존 activity에 데이터를 전달한다.

intent에 전달할 데이터를 담고, activity에 이 intent까지 함께 전달한다.

intent 없이 RESULT_OK / RESULT_CANCELED만 전달할 수도 있다.

 

 

3. 기존 activity에서 데이터 받기 (MainActivity.kt)

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
    
        if (requestCode == REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                // intent에 담긴 데이터 처리
            } else if (resultCode == RESULT_CANCELED) {
                // intent에 담긴 데이터 처리
        } else {
            //...
        }
    }

새로운 activity를 시작했던, 기존 activity에서 onActivityResult()를 override해서 데이터를 받아온다.

requestCode가 startActivityForResult에 전달했던 requestCode와 동일한지 확인하고,

새로운 activity가 보낸 데이터(data: Intent)를 받아 처리한다.

또한 데이터를 보낼 때 인자로 전달한 resultCode가 RESULT_OK인지, RESULT_CANCELED인지에 따라 로직을 구분할 수 있다.

 

이 onActivityResult() 함수가 deprecated 되었다.

이 함수를 대체할 함수가 registerForActivityResult()인데, 어떻게 사용하면 좋을지 알아보자.

 

 

 

deprecated 함수의 대안 - registerForActivityResult

1. 데이터를 받을 activity에서 launcher 생성하기 (MainActivity.kt)

private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val intent = result.data
            // intent에 담긴 데이터 처리
        } else { // Activit.RESULT_CANCELED
       	    //...
        }
    }

먼저 데이터를 받을 activity에서 launcher를 생성해야 한다.

registerForActivityResult를 통해 데이터를 받는다.

이 함수의 인자로는 ActivityResultContracts.StartActivityForResult() 가 들어간다.

이 launcher를 실행하면 액티비티를 시작하고 결과를 받아온다는 의미이다.

또한 결과를 받아오고 그 결과를 처리할 콜백을 인자로 넣는다.

 

* launcher는 onResume() 이전에 생성해야 한다. 즉, onStart()나 onCreate(), 함수 외부에서 생성한다.

 

 

2. launcher 실행해서 새로운 activity 시작하기 (MainActivity.kt)

    resultLauncher.launch(Intent(this, SubActivity::class.java))

생성한 launcher를 실행한다. 이때 launch() 함수의 인자로 새로 시작할 activity가 담긴 intent가 실행된다.

그러면 launch()함수가 호출될 때 새로운 activity가 시작된다.

 

 

3. 새로운 activity에서 데이터 보내기 (SubActivity.kt)

    setResult(RESULT_OK, Intent().apply {
    	putExtra("RESULT_KEY1", "test1")
        putExtra("RESULT_KEY2", "test2")
    }) // RESULT_CANCELED도 가능
    
    finish()

여기서는 기존 방식과 동일하게 activity를 끝내기 전에 setResult()를 통해 데이터를 전달한다.

이 activity가 끝나면 기존 activity의 launcher의 콜백이 실행되어 데이터를 받을 것이다.

 

 

 

 

 

 

+ 추가적으로 registerForActivityResult를 통해 권한을 요청하는 방법을 포스팅했다.

https://thdbs523.tistory.com/371

 

[안드로이드/코틀린] registerForActivityResult() - 권한 요청하기

권한 요청 방법 - 기존 방식 먼저 기존에 안드로이드에서 권한을 요청하기 위해 사용한 방법을 알아보자. 1. manifest manifest 파일의 바깥에 을 넣어준다. 2. 권한 요청 fun requestPermissions() { if(ContextCom

thdbs523.tistory.com

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함