1 minute read


안드로이드 화면이동간 데이터를 주고 받는데 startActivityForResult() 메소드가 deprecated 되서 사용을 못하게 되었다.



2020년 5월 쯤 deprecated 되었고, 지금은 registerForActivityResult를 사용해서 결과 값을 받아온다고 한다.
아래는 registerForActivityResult의 사용법이다.

1.화면 이동하기(PageMove.kt)

메인 화면이 될 페이지에서 다른 페이지로 화면을 이동한다.

1
2
3
4
5
6
7
8
9
10
11
12
var btnPageMove : Button = findViewById(R.id.btnPageMove)
    btnPageMove.setOnClickListener{
        //입력한 텍스트를
        val editText = findViewById<EditText>(R.id.textParam)       
        val message = editText.text.toString()

        //PageMove2 화면으로 넘긴다
        val intent = Intent(this, PageMove2::class.java).apply {    
            putExtra(EXTRA_MESSAGE, message)
        }
        getResult.launch(intent)
    }


2. 데이터 수신부 설정(PageMove.kt)

새로운 액티비티에서 부모 액티비티로 리턴 값을 전달해주고 종료하기

1
2
3
4
5
6
7
8
9
var getResult = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()){ result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val rstData = result.data?.getStringExtra("param")

            //수신한 데이터를 토스트로 띄움
            Toast.makeText(this ,"result Data : " + rstData, Toast.LENGTH_SHORT).show()
        }
}


3. 데이터 송신부 설정(PageMove2.kt)

PageMove에서 넘어오느 데이터를 textView에 세팅하고, 그 값을 다시 리턴한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
//PageMove에서 보낸 데이터를 textView에 보여줌
val message = intent.getStringExtra(EXTRA_MESSAGE)
revView.setText(message)

//받은데이터 다시 PageMove로 리턴 후 Acitivity 종료
var btnSend : Button = findViewById(R.id.sendRev)
btnSend.setOnClickListener {
    var rtText = revView.text.toString()
    var intent = Intent(this, PageMove::class.java)
    intent.putExtra("param", rtText)
    setResult(Activity.RESULT_OK, intent)
    finish()
}


굳이 데이터를 넘기고 다시 리턴 받고 할 필요는 없지만 어차피 화면 간에 데이터를 주고받고 하는 건 기본적으로 알아야 하기 때문에 위처럼 정리해 봤다.
참고용으로 전체코드를 아래에 넣어둔다.



4. 전체 코드

4.1 PageMove.kt

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
class PageMove : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_page_move)

        //수신부
        var getResult = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()){ result ->
                if (result.resultCode == Activity.RESULT_OK) {
                    val rstData = result.data?.getStringExtra("param")
                    Toast.makeText(this ,"result Data : " + rstData, Toast.LENGTH_SHORT).show()
                }
        }

        //화면이동
        var btnPageMove : Button = findViewById(R.id.btnPageMove)
        btnPageMove.setOnClickListener{
            val editText = findViewById<EditText>(R.id.textParam)
            val message = editText.text.toString()
            val intent = Intent(this, PageMove2::class.java).apply {
                putExtra(EXTRA_MESSAGE, message)
            }
            getResult.launch(intent)
        }
    }
}


4.2 PageMove2.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PageMove2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_page_move2)

        //PageMove에서 넘어온 데이터 보여주기
        val message = intent.getStringExtra(EXTRA_MESSAGE)
        revView.setText(message)

        //넘어온 데이터 다시 리턴 후 Activity 종료
        var btnSend : Button = findViewById(R.id.sendRev)
        btnSend.setOnClickListener {
            var rtText = revView.text.toString()
            var intent = Intent(this, PageMove::class.java)
            intent.putExtra("param", rtText)
            setResult(Activity.RESULT_OK, intent)
            finish()
        }
    }
}