티스토리 뷰


안드로이드 개발을 하다모면 액티비티간 데이터를 주고받아야 하는 경우가 있습니다.
이런 경우 startActivityForResult() 와 onActivityResult()를 이용해 처리할 수 있습니다.

순서는 아래와 같습니다.
1. 액티비티 호출시 리퀘스트 코드를 추가한다.
2. 호출된 액티비티는 액션을 한 후 결과를 세팅하고 종료한다.
3. 기존 액티비티는 결과를 받아 처리한다.






1. 액티비티 호출시 리퀘스트 코드를 추가한다

기본적으로는 액티비티를 호출할 때, startActivity() 메소드를 사용하지만,
이 경우에는 startActivityForResult() 메소드를 사용해야 합니다.

액티비티 A가 있다고 해봅니다.
액티비티 A는 intent에 데이터를 넣고, 액티비티 B를 호출할 것입니다.
이때, 액티비티 A는 자신이 호출한 액티비티 B에서 처리된 결과를 데이터로 받고 싶어 합니다.


처음에는 아래와 같이 Activity A 만 존재하고 있습니다.





이제 이 Activity A는 B를 호출합니다. 호출은 아래와 같이 이루어 집니다.
intent에 호출할 Activity B에 대한 정보와, 여러 데이터들을 담습니다.





Activity B가 호출 되면 아래와 같이 될것입니다.





1
startActivityForResult(intent, requestCode);





2. 호출된 액티비티는 액션을 한 후 결과를 세팅하고 종료한다

호출된 Activity B는 자신을 호출한 Activity A로 부터 받은 데이터를 가지고 무엇인가 자신의 일을 수행할 것입니다.
그리고 모든 수행을 마쳤다면, 아래와 같이 합니다.

결과로 돌려줄 데이터가 있다면, setResult(RESULT_OK, intent) 를 실행해 결과를 함께 넘겨주고,
결과는 주지 않고, 뭔가 수행했다는 신호정도만을 돌려줄땐, setResult(RESULT_OK) 를 실행합니다.

- 여기서는 RESULT_OK 를 넣었지만, 실제로 RESULT_CANCELED 와 RESULT_FIRST_USER 라는 플래그도 있습니다.
- 중요한건 프로그래머가 식별할 수 있는 플래그를 사용하면 되는 것입니다.

그리고 모든 처리가 끝났다면 Activity B는 자신을 finish() 하면 됩니다.



1
2
3
4
Intent intent = new Intent();
intent.putExtra("resultSetting", "결과를 처리하였습니다.");
this.setResult(RESULT_OK, intent);
finish();






3. 기존 액티비티는 결과를 받아 처리한다

Activity B는 자신을 종료시키면서 Activity A를 다시 화면위로 올려놓습니다.
그럼 Activity A에서는 자동으로 onActivityResult() 메소드가 호출됩니다.

프로그래머는 Activity A에서 onActivityResult() 메소드를 override해서 자신이 되돌려 받은 결과로 처리하고 싶은 것을 구현하면 됩니다.







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* (non-Javadoc)
* @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// 수행을 제대로 한 경우
if(resultCode == RESULT_OK && data != null)
{
String result = data.getStringExtra("resultSetting");
}
// 수행을 제대로 하지 못한 경우
else if(resultCode == RESULT_CANCELED)
{
}
}



[출처] http://croute.me/352
[작성자] crOutE
댓글