안드로이드 앱개발을 하면서,

액티비티간에 데이터를 주고받는 경우가 있는데요.


보통은, intent객체를 생성해서 putExtra()메소드의 인자로 데이터를 실어서 보낸다음, 

startActivity 메소드에 intent객체를 인자로 주어서, 액티비티간에 데이터를 주고 받았는데요.


이번에는 startActivityForResult를 이용해서 데이터를 주고받는 경우에 대해서 정리해보겠습니다.

이 경우는 요청했던 액티비티가 종료되는 시점에, 어떤 데이터를 받아오고 싶을때 사용하는데요.


예를들면, 설정화면인 Activity_A가 알람소리를 선택하도록 Activity_B를 요청하고,

알람소리의 리스트화면인 Activity_B에서 선택된 아이템의 종류를 선택하고 확인버튼을 누르면,

그 값을 Activity_A에게 다시 전달되도록 하는 경우입니다.


글로 써보니, 케이스가 조금 복잡하지만, 실제 구현은 간단한데요.

한번 코드를 작성하면서 정리해보겠습니다.



1.  Activity_A에서 StartActivityForResult 


먼저, 할 것은 A액티비티에서 startActivityForResult로 B액티비티를 start하는 것입니다.

마지막에 onActivityResult로 값을 불러올때, 사용할 requestCode는 여기서 사용한 값을 사용합니다.




2. Activity_B 에서 Intent 와 Bundle 객체 생성


먼저, intent객체를 생성하구요.
그 다음 데이터를 넣을, Bundle객체를 생성해 줍니다.

Bundle 객체는 key-value 형태의 맵인데요. (이에 대해서는 차후에, Parcelable 인터페이스에 대해 정리하면서, 같이 정리해보고자 합니다.)

다음으로 intent의 putExtras 메소드를 이용해서 bundle을 실어서 보내줍니다.

아직 B액티비티에서 구현할 코드가, 두줄이 더 남았는데요. 아래에서 보도록 하겠습니다.




2. setResult() 메소드


여기서부터, 일반적으로 하는 Activity간 데이터 전달과는 다른 부분이 생기는데요.

바로 setResult()메소드를 사용하는 것입니다.


이 setResult의 소스코드한번 살짝 보고가겠습니다.

요청한 액티비티에게 넘겨줄 결과값을 셋하는 메소드라고 하는 것하고,

resultCode와 data를 set하는 것을 알  수 있습니다.

사용할 수 있는 resultCode값으로는 cancel과 ok, first_user가 있네요.




그럼, 위에서 적은 코드에 이어서, 실제로 setResult를 사용하겠습니다.

RESULT_OK값을 resultCode로 보내주고요, intent를 실어보낼 데이터로 넘겨줍니다.

데이터도 다 보냈으니, 이 activity는 finish() 해주겠습니다.




3. onActivityResult 로 받아오기


데이터를 받아올 액티비티에서는 위에서 setResult한 값을 받아와야 하는데요.

따로 액티비티를 실행시켜서, onCreate()에서 intent를 받아오는 것이 아니구요.

onActivityResult에서 값을 받아옵니다.


인자로 들어오는 intent인 data를 bundle객체로 받아옵니다.

위에서 설명드린대로, bundle은 키-밸류형태를 취하므로, 

인자로 키값을 주고 밸류값을 얻어옵니다.

이제 다 되었습니다. bundle에서 원하는 value값을 받아왔으니,

UI로 표시할 수도 있겠습니다.

여기서는 간단히, setText()로 UI에 표시하는 정도로 마무리 하겟습니다.




+ Recent posts