다른 액티비티로 데이터 전달하기

데이터를 전달하는 방향에 따라 전달방법을 두가지로 나눌 수 있습니다.

  • A Activity에서 B Activity를 호출과 함께 Data 전달
  • A Activity가 B Activity를 호출한 뒤, B Activity를 종료하며 결과값을 A액티비티로 데이터 전달

다른 액티비티로 데이터 전달하기

사용자의 텍스트 입력을 받을 수 있는 InputActivity가 있다고 가정한다면 다음과 같이 입력한 데이터를 String으로 변환 할 수 있습니다.

String data = editText.getText().toString();

컴포넌트(예:액티비티)간 데이터 전달을 위해서는 인텐트가 필요합니다. 그러므로 인텐트를 만들도록 하겠습니다. 데이터를 전달받을 액티비티는 ResultActivity입니다.

Intent intent = new Intent(InputActivity.this, ResultActivity.class);

인텐트와 data가 모두 준비되었습니다. putExtra메소드를 통해 인텐트에 data를 싣어보겠습니다.

intent.putExtra("my_data", data);

첫번째 인자는 String 타입의 key 이며, 두번째인자가 실제로 전송하고자 하는 data입니다. (key: value = my_data, data)

이제 startActivity()호출 합니다.

startActivity(intent);

 

이제 ResultActivity로 가보겠습니다

Intent intent = getIntent();
String myData = intent.getStringExtra("my_data");

 액티비티가 가지고 있는 getIntent() 메소드를 이용하여 이전 액티비티에서 전달 한 인텐트를 가져올 수 있습니다.
인텐트에는 InputActivity에서 전달한 데이터가 포함되어있으니 getStringExtra()와 key값을 이용하여 data를 얻습니다.

액티비티로부터 데이터 전달 받기

이번엔 액티비티로 부터 데이터를 전달 받는 방법에 대해서 알아보겠습니다

먼저 인텐트를 통해 다른 액티비티(InputActivity2)를 호출해야합니다.

public class RecieverActivity extends AppCompatActivity{
    ...
    Intent intent = new Intent(ReceiverActivity.this, InputActivity2.class)
    startActivityForResult(intent, 1234);
    ...
}

startActivityForResult(Intent, int)라는 메소드를 호출해야 합니다. 이 메소드를 통해 다른 액티비티로부터 데이터를 전달받기를 기대할 수 있습니다.

두번째 인자는 Request Code로 결과값을 주는 액티비티를 구분하기 위한 사용자정의 코드 입니다. 

InputActivity2는 사용자의 입력을 받을수 있는 EditText를 포함하고 있는 액티비티입니다.

String data = editText.getText().toString();
Intent intent = new Intent();//startActivity()를 할것이 아니므로 그냥 빈 인텐트로 만듦
intent.putExtra("my_data",data);
setResult(RESULT_OK,intent);
finish();

먼저 EditText에 입력한 값을 String 형 data로 변환합니다. 그런뒤 인텐트를 만들어 해당 data를 싣습니다. 여기까지는 위의 내용과 같습니다. 

setResult(int, Intent)를 보시면 Result Code와 intent를 입력하고 있습니다.
Result Code는 Activity클래스에 상수로 선언되어있으며, Activity.RESULT_OK, Activity.RESULT_CANCELED, RESULT_FIRST_USER 가 있습니다.

결과값 코드 의미
RESULT_OK 수행한 작업이 성공적일때 일반적으로 쓰는 코드
RESULT_CANCELED 수행한 작업이 실패일때 일반적으로 쓰는 코드
RESULT_FIRST_USER 사용자 정의 결과 코드 
일반적으로 다음과 같이 사용됩니다.
public static final int MY_RESULT_CODE = Activity.RESULT_FIRST_USER +1;

setResult()코드 뒤에 finish()를 하여 InputActivity2를 종료하면 해당 인텐트가 이전 액티비티(ReceiverActivity)로 전달됩니다.

public class ReceiverActivity extends AppCompatActivity {
    ...
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1234 && resultCode == RESULT_OK){
            String myData = data.getStringExtra("my_data");
            textView.setText(myData);
        }else{
            textView.setText("No Data");
        }
    }
    ...
}

InputActivity2의 setResult값을 전달받는 위치는 onActivityResult()입니다.
액티비티를 호출했던 Request Code와 Result Code 그리고 인텐트를 파라미터로 받을 수 있습니다.
InputActivity2에서 만든 인텐트로부터 my_data키 값을 통해 데이터를 꺼낼수 있습니다

본문의 예제는 github의 012 Activity_Communication모듈에서 확인가능합니다.

카테고리: Tutorial

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.