본문 바로가기

Android

[Android] startActivity()와 startActivityForResult()의 차이점

애플리케이션을 개발할 때는 다수의 Activity(화면)을 코딩하게 됩니다.

하나의 Activity로는 서비스를 제공하는 데에 있어서 많은 제한이 있기 때문입니다.

즉, 용도에 맞는 Activity들이 존재하고, 알맞는 시기에 화면 전환이 이루어져야 합니다.

 

단순히 새로운 Activity를 열어주는 경우도 있고, Sub Activity의 결과값을 Main Activity로 넘겨줘야 하는 경우도 있습니다.

이런 활동을 startActivity()와 startActivityForResult()가 지원합니다.

 

1. startActivity()

startActivity()는 단순히 새로운 Activity를 시작할 때 사용합니다.

앞서 intent 화면 전환 포스팅에서도 사용한 것이 startActivity()입니다.

원형과 사용법은 간단하며 코드는 다음과 같습니다.

 

// 원형
public void startActivity(Intent intent)

// 사용법
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent)

 

자세한 사용법은 Intent 화면전환을 참조해주시길 바랍니다.

 

2. startActivityForResult()

startActivityForResult()는 startActivity()와 달리 Sub Activity의 결과값을 Main Activity로 가져올 수 있습니다.

결과값을 가져오기 위해서 onActivityResult()도 함께 사용하게 됩니다.

 

각각의 원형은 다음과 같습니다.

 

public void startActivityForResult (Intent intent, int requestCode)

protected void onActivityResult (int requestCode, int resultCode, Intent data)

 

startActivityForResult()는 매개변수가 2개로 intent와 requestCode가 있습니다.

 

1) intent는 Sub Activity입니다. (해당 예제에선 Activity 전환을 다루기에 Sub Activity로 명시했습니다.)

2) requestCode는 해당 Activity를 구별할 수 있는 상수값으로 requestCode는 호출된 Activity가 종료될 때 반환됩니다.

 

onActivityResult()는 매개변수가 3개로 requestCode, resultCode, data가 있습니다.

 

1) requestCode는 startActivityForResult()에 제공되었던 상수값으로, Sub Activity가 종료되면서 반환된 값이 저장됩니다.

2) resultCode는 setResult()를 통해 Sub Activity가 반환한 int형 결과 코드입니다. 정상 동작 여부를 판단할 수 있습니다.

3) data는 Main Activity에게 결과 데이터를 반환할 수 있는 intent입니다.

 

requestCode를 통해 Activity를 구별하게 되면 Activity 출처를 식별할 수 있고, onActivityResult() 내에서 제어가 가능해져서 안정성이 좋아집니다.

 

자세한 사용법은 예제를 통해서 설명하겠습니다.

 

3. startActivityForResult() 예제

Main Activity에서 + 버튼을 누르면 Sub Activity가 호출됩니다.

Sub Activity에서 2개의 숫자를 지정해주고 버튼을 누르면 두 수의 합이 Main Activity로 반환해주도록 작성했습니다.

 

아래는 Main Activity에서 + 버튼을 눌렀을 때 Sub Activity가 호출되는 코드입니다.

 

btn_plus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MainActivity.this, CalculateActivity.class);
        startActivityForResult(intent, REQUEST_PLUS);
    }
});

 

아래는 Sub Activity에서 결과값 반환 버튼을 눌렀을 때 실행되는 코드입니다.

호출된 Sub Activity에선 2개의 정수값을 입력 받습니다.

결과값 반환 버튼을 눌렀을 때 입력된 정수값이 없으면 0으로 처리해서 합을 구합니다.

 

btn_result.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(edit_1.getText().toString().equals(""))
            edit_1.setText("0");
        if(edit_2.getText().toString().equals(""))
            edit_2.setText("0");
        int num1 = Integer.parseInt(edit_1.getText().toString());
        int num2 = Integer.parseInt(edit_2.getText().toString());
        int result = num1 + num2;

        Intent intent = new Intent();
        intent.putExtra("result", "연산 결과는 " + result + " 입니다.");
        setResult(RESULT_OK, intent);
        finish();
    }
});

 

intent에 'result'라는 key값과 "연산 결과는 ..."이라는 value를 저장합니다.

setResult()에 정상처리 되었음을 알리는 상수값 RESULT_OK와 결과값을 지니는 intent를 Main으로 보냅니다.

finish()를 통해 Sub Activity를 종료해줍니다.

 

이후 Main Activity로 넘어와서 onActivityResult()가 동작합니다.

 

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if(requestCode == REQUEST_PLUS && resultCode == RESULT_OK) {
        tx_result.setText(data.getStringExtra("result"));
    }
}

 

requestCode가 Sub Activity를 호출할 때 제공했던 REQUEST_PLUS이면서 resultCode가 RESULT_OK이면

TextView에 결과값을 작성하는 코드입니다.

 

아래는 실행 결과입니다.

 

 

전체 코드는 Github를 참고해주시면 감사하겠습니다.

 

※ 참조

https://developer.android.com/reference/android/app/Activity?hl=ko#onActivityResult(int,%20int,%20android.content.Intent) 

 

Activity  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

https://developer.android.com/reference/android/app/Activity?hl=ko#startActivityForResult(android.content.Intent,%20int) 

 

Activity  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

https://developer.android.com/reference/android/app/Activity?hl=ko#startActivity(android.content.Intent) 

 

Activity  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

https://crazykim2.tistory.com/497

 

[Android Studio] startActivity()와 startActivityForResult() 의 차이점

안녕하세요 안드로이드 개발을 하다보면 액티비티에서 액티비티로 왔다갔다 경우 startActivity()와 startActivityForResult()를 사용하여 개발을 하는 경우가 많습니다 안드로이드를 많이 개발한 분들은

crazykim2.tistory.com

https://mailmail.tistory.com/15

 

[안드로이드 Intent] startActivity(), startActivityForResult()를 통한 페이지 넘어가기

안녕하세요. 안드로이드 PEACE-입니다. 안드로이드 스터디 [열 두번째] 글입니다. Android Intent를 통해 Activity, Service, BroadCast 등 여러 구성요소 사이에서 통신을 용이하게해줍니다. 오늘은 Acitivity..

mailmail.tistory.com