출처 :
http://neoroid.tistory.com/entry/android-onActivityResult-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
onActivityResult는,
정말 간단하게 설명하면 Activity A와 B가 있을 때,
A에서 B로 갔다가 다시 A로 넘어올 때 사용하는, 안드로이드에서 제공하는 기본 메소드입니다.
이 메소드의 대표적인 용도 중 하나는 커스텀 다이얼로그를 사용할 때 입니다.
커스텀 다이얼로그를 짤 때 가장 쉬운 방법으로 액티비티를 다이얼로그화하는 경우가 있습니다.
하지만 액티비티를 이동할 때
Intent intent = new Intent(this, B.class);
startActivity(intent);
finish();
혹은
startActivity(new Intent(this, B.class));
finish();
이런식으로 넘기는 경우가 있는데 다이얼로그가 호출되면 배경화면으로 A 액티비티가 반투명하게 보여야 하지만
finish()를 해버렸기 떄문에 보이지 않습니다.
finish()를 하지 않더라도 위의 방식을 사용할 경우, A로 다시 값을 가져와야 하는 경우에는 intent.puExtra로 값을 넘겨야 하는데
그러면 다시 인텐트를 호출하게 되므로 B로 넘어가기 전의 A를 finish() 하지 않았기 때문에 결과적으로 A 액티비티가
두번 호출되는 단점이 있습니다.
B 액티비티에서 A액티비티로 자연스럽게 값을 넘기면서 돌아오기 위해서는 일단 A 액티비티에서
Intent intent = new Intent(this, B.class);
startActivityForResult(intent, 0);
이런식으로 B로 넘어가 A액티비티를 종료하지 않게 한 후
B에서 다시 A로 넘어 올 때
setResult(resultCode);
finish();
단 두줄로 종료해 주거나 A로 값을 넘겨준다면
Intent intent = new Intent();
intent.putExtra("key", value);
setResult(RESULT_CODE, intent);
finish();
이렇게 넘겨줍니다.
이 때 B에서 setResult의 괄호안에 있는 resultCode에 정수형 변수를 넣어주어(예를 들면 0,1,2...) A로 넘기게 되는 것입니다.
다시 A 액티비티로 돌아왔을 때 A 액티비티에 선언된 onActivityResult는 B의 setResult의 resultCode 신호를 감지하여
작업을 행하게 되는데 두줄로 끝냈을 경우 이 부분의 소스는 이렇습니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
////////////////////////////
//B의 신호를 받아 실행할 작업
////////////////////////////
break;
default:
break;
}
}
만약 B에서
setResult(1);
finish();
와 같은 결과로 액티비티를 종료했다면 A에서는 setResult의 resultCode인 정수 1을 인지하여
onActivityResult의 case 1에 해당되는 부분을 실행하게 됩니다.
그리고 B에서 A로 값을 넘긴 경우라면
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
String key = data.getStringExtra("key");
////////////////////////////
//B의 신호를 받아 실행할 작업
////////////////////////////
break;
default:
break;
}
}
########################## 응용 #########################
A액티비티에서..
BActivity.invokeActivityForResult(AActivity.this, clickedLine, 0);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Const.ActivityResult.PROFILE_MERGE_SUCCESS) { // TODO return; } else if (resultCode == Const.ActivityResult.LINE_REMOVE_SUCCESS) { // 자식 액티비티에서 성공후 리턴값 받아서 처리 } super.onActivityResult(requestCode, resultCode, data); }
B액티비티에서..
Intent data = new Intent(); data.putExtra("line", mLine); BActivity.this.setResult(Const.ActivityResult.LINE_REMOVE_SUCCESS, data); finish();
'안드로이드 개발 팁' 카테고리의 다른 글
android interface를 이용한 상태 변동시 체크 방법 (0) | 2013.06.10 |
---|---|
android 폰트 일괄 적용 (1) | 2013.06.05 |
안드로이드 strings.xml 파일에서 변수 넣기 (0) | 2013.05.06 |
enum 테스트 (0) | 2013.04.30 |
안드로이드 모션 샘플(목록 왼쪽 이동) (0) | 2013.04.16 |