loading

프로그래밍/안드로이드

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

침착곰 2021. 5. 8. 16:02
반응형

안녕하세요

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

안드로이드를 많이 개발한 분들은 차이점에 대해서 설명을 안 해도 잘 아실텐데

시작 한지 얼마 되지 않은 분들은 잘 모를 수 있습니다

저도 이번에 블로그에 포스팅을 하면서 제대로 정리해봤습니다

이 두 메서드의 차이점에 대해서 알아보겠습니다

 

목차

Intent
startActivity
startActivityForResult
예제 코드
결과 화면

 


Intent

startActivity를 알아보기 전에 intent를 사용하여 어떻게 화면을 이동할지 정합니다

intent란?

파파고 번역기를 통해 번역하면 "의도", "흥미의" 이런 뜻입니다

Activity A 에서 Activity B로 이동을 할 때 intent를 사용하여 구현을 해줍니다

구문은 보통 이렇게 사용됩니다

현재 화면(this)에서 B 액티비티(SecondActivity)로 이동을 정의한 것입니다

Intent intent = new Intent(this, SecondActivity.class);

 


startActivity

이제 startActivity의 사용법에 대해서 알아보겠습니다

startActivity는 intent에서 정의한 두 개의 액티비티의 이동 액션을 수행합니다

문법은 그렇게 어렵지 않습니다

 Intent intent = new Intent(this, SecondActivity.class);
 startActivity(intent);

 

 


startActivityForResult

startActivityForResult에 대해서 알아보겠습니다

startActivity에 비하면 사용법이 약간 복잡합니다

이 문법은 액티비티간의 이동 이외에도 A Activity에서 B Activity로 데이터를 주고받는 것도 가능합니다

아래와 같이 intent 이외에도 requestCode를 넘겨줘야합니다

requestCode의 용도는 아래에서 설명하겠습니다

Intent intent2 = new Intent(this, SecondActivity.class);
startActivityForResult(intent2, 1000);

 

다른 폼에서는 아래와 같이 resultCode를 정의해서 결과를 setResult로 넘겨줍니다

Intent intent = new Intent();
intent.putExtra("ResultMsg", "startActivityForResult 테스트");
setResult(RESULT_OK, intent);
finish();

 

이제 넘겨준 결과를 받습니다

아래와 같이 onActivityResult를 사용하여 결과를 받아줍니다

위에 requestCode를 1000으로 정의했는데 onActivityResult에서 requestCode가 1000인것만 받도록 코드를 짰습니다

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1000) {
        if (resultCode == RESULT_OK) {
            String resultMsg = data.getStringExtra("ResultMsg");
            Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
        } else if (resultCode == RESULT_CANCELED) {
            String resultMsg = data.getStringExtra("ResultMsg");
            Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
        } else {

        }
    }
}

 

단계를 정의한다면

1. startActivityForResult(intet, requestCode)

2. setResult

3. onActivityResult(requestCode, resultCode, data

순으로 사용된다고 보면 됩니다

 


 

 

예제 코드

이제 제가 작성한 예제 코드를 알아보겠습니다!

먼저 화면 디자인입니다

1. activity_main.xml

버튼은 두 개로 구성하였습니다

"STARTACTIVITY" 버튼을 클릭하면 startActivity() 메소드를 탑니다

"STARTACTIVITYRESULT" 버튼을 클릭하면 startActivityForResult() 메소드를 타도록 구현했습니다

 

2. activity_second.xml

버튼은 세 개로 구성하였습니다!

"BACKPROCESS" 단순 뒤로 이동합니다

"ONRESULTBACKOK" ResultCode로 OK를 보냅니다

"ONRESULTBACKCANCEL" ResultCode로 CANCEL을 보냅니다

 

3. MainActivity.java

MainActivity에서 화면간 이동 startActivity와 startActivityForResult를 구현해서 액티비티간 이동을 시킵니다

package com.example.startactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // 디자인 변수 선언
    Button startActivity;
    Button StartActivityResult;

    // onCreate
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 메인 레이아웃 매핑
        setContentView(R.layout.activity_main);

        // 버튼 매핑
        startActivity = findViewById(R.id.btnStartActivity);
        StartActivityResult = findViewById(R.id.btnStartActivityResult);

        // 버튼 클릭 이벤트 정의
        startActivity.setOnClickListener(this);
        StartActivityResult.setOnClickListener(this);
    }

    // 버튼 이벤트 정의
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // startActivity()
            case R.id.btnStartActivity:
                Intent intent = new Intent(this, SecondActivity.class);
                startActivity(intent);
                break;
            // startActivityForResult()    
            case R.id.btnStartActivityResult:
                Intent intent2 = new Intent(this, SecondActivity.class);
                startActivityForResult(intent2, 1000);
                break;
        }
    }

    // startActivityForResult 결과 return
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // requestCode가 1000인 경우
        if (requestCode == 1000) {
            // OK 이벤트
            if (resultCode == RESULT_OK) {
                String resultMsg = data.getStringExtra("ResultMsg");
                Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
            // CANCEL 이벤트    
            } else if (resultCode == RESULT_CANCELED) {
                String resultMsg = data.getStringExtra("ResultMsg");
                Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
            // 그 외의 경우 디폴트 처리    
            } else {

            }
        }
    }
}

 

4. SecondActivity.java

SecondActivity에서는 finish()를 사용하여 Activity를 종료합니다

대신 intent와 setResult를 통해서 finish를 처리할 때 MainActivity로 데이터를 넘겨주는 처리를 합니다

package com.example.startactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity implements View.OnClickListener {

    // 디자인 변수 선언
    Button backActivity;
    Button backResultOK;
    Button backResultCANCEL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 메인 레이아웃 매핑
        setContentView(R.layout.activity_second);

        // 버튼 매핑
        backActivity = findViewById(R.id.btnBack);
        backResultOK = findViewById(R.id.btnResultBackOk);
        backResultCANCEL = findViewById(R.id.btnResultBackCancel);

        // 버튼 클릭 이벤트 정의
        backActivity.setOnClickListener(this);
        backResultOK.setOnClickListener(this);
        backResultCANCEL.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 뒤로 가기
            case R.id.btnBack:
                Intent intent3 = new Intent();
                setResult(9999999, intent3);
                finish();
                break;

            // OK 버튼
            case R.id.btnResultBackOk:
                Intent intent = new Intent();
                // ResultMsg : startActivityForResult 테스트 넘겨준다
                intent.putExtra("ResultMsg", "startActivityForResult 테스트");
                setResult(RESULT_OK, intent);
                finish();
                break;

            // CANCEL 버튼
            case R.id.btnResultBackCancel:
                Intent intent2 = new Intent();
                // ResultMsg : startActivityForResult 테스트 넘겨준다
                intent2.putExtra("ResultMsg", "startActivityForResult 테스트");
                setResult(RESULT_CANCELED, intent2);
                finish();
                break;
        }
    }
}

 


결과 화면

데이터를 주고받는 것이 성공적으로 이뤄진 모습입니다

Toast 메시지박스로 데이터가 출력된 모습입니다

 

startActivity와 startActivityForResult에 대해서 간단하게 설명하고 차이점에 대해서 알아봤습니다

이 글을 보는 안드로이드 개발자 분들께 도움이 되는 글이었으면 좋겠습니다 ㅎ

여기까지 포스팅을 마치겠습니다

반응형
그리드형