차근차근/Android

startActivityForResult(), onActivityResult() 사용하기

예쁜꽃이피었으면 2014. 8. 29. 13:09

http://gardenpu.tistory.com/122


안드로이드 코딩을 할 때, 가장 기본적인 메소드 중 하나가 바로 startActivityForResult()이다.

하지만 웹 어디를 뒤져봐도 사용법을 쉽게 설명해 둔 페이지는 찾아보기가 힘들더라. (망할것)

나처럼 완전 삽질을 하는 사람이 생겨나는 것을 막고자 이렇게 포스팅을 해보려 한다.

 

안드로이드의 Activity들은 startActivityForResult()라는 메소드를 통해 sub activity를 만들고 Activity끼리 서로 데이터를 교환할 수 있다.

그 사이에는 'extra'라고 하는 통로가 존재하는데, 이 부분을 잘 알아야 한다.

 

Activity A가 Activity B를 서브 엑티비티로서 부르고 그로부터 결과값인 데이터를 전송받기 위해서는 어떻게 해야 할까?

먼저 삽화를 통해 기본 원리를 파악해보도록 하자.

 

다음과 같은 원리이다.

Activity A가 startActivityForResult를 통해서 Activity B를 호출하면,

B는 종료가 되면서 Result 값을 통해 Extra 꾸러미를 넘긴다.

그러면 Activity는 Extra 꾸러미 안에 있는 데이터들을 꺼내서 사용할 수 있는 것이다.

 

그렇다면 실제 구현 과정에서 어떤 작업들을 해주어야 하는지 살펴보자.

 

[Activity A 사이드]

Activity A에서 구현되어야 할 부분은,

첫째, int값의 requestCode 값을 설정해준다.

둘째, Intent를 만들어 Activity B를 실행시킨다.

셋째, onActivityResult()를 통해 각 requestCode값에 해당하는 결과값을 받아온다.

 

[Activity B 사이드]

Activity B에서 구현되어야 할 부분은,

첫째, Intent를 만들어 데이터 꾸러미를 Intent에 추가시킨다.

둘째, 결과값을 보내면서 Extra 꾸러미를 가지고 있는 Intent를 함께 넘겨준다.

 

간단하지 않은가? 그럼 코드에서는 이와같은 것들이 어떻게 구현이 될까?

 

[Activity A 사이드]

private static final int B_ACTIVITY = 0;

 

public void onCreate(){

...

Intent a_i = new Intent(this, B.class);

startActivityForResult(a_i, B_ACTIVITY);

...}

 

public void onActivityResult(int requestCode, int resultCode, Intent intent){

super.onActivityResult(requestCode, resultCode, intent);

 

switch(requestCode){

case B_ACTIVITY: // requestCode가 B_ACTIVITY인 케이스

if(resultCode == RESULT_OK){ //B_ACTIVITY에서 넘겨진 resultCode가 OK일때만 실행

intent.getExtras.getInt("data"); //등과 같이 사용할 수 있는데, 여기서 getXXX()안에 들어있는 파라메터는 꾸러미 속 데이터의 이름표라고 보면된다.

}

}

}

 

[Activity B 사이드]

 

Bundle extra;

Intent intent;

 

onCreate(){

...

extra = new Bundle();

intent = new Intent(); //초기화 깜빡 했다간 NullPointerException이라는 짜증나는 놈이랑 대면하게 된다.

...

 

extra.putInt("data", 1);

intent.putExtras(extra);

this.setResult(RESULT_OK, intent); // 성공했다는 결과값을 보내면서 데이터 꾸러미를 지고 있는 intent를 함께 전달한다.

this.finish();

}

 

 

이와 같이 하면 B 사이드에서 1이라는 데이터값을 가지고 있는 "data"라는 이름표의 꾸러미는 Activity A로 결과값으로써 전달이 되고, 사용이 될 수 있는 것이다.

나는 Bundle을 이용해서 했는데 번들을 사용하지 않고도 결과값을 보내기 위한 메소드는 있다고 본다. 이거는 API를 보면 쉽게 파악할 수 있다.

또한 int값 말고도 모든 데이터 변수들을 보낼 수 있어, 그것에 대한 걱정은 하지 않아도 된다.



출처 : http://blog.naver.com/hisukdory?Redirect=Log&logNo=50088038280

반응형