본문 바로가기
안드로이드 자바

[Android][Java] 새 액티비티에서 응답받기 Intent, startActivityForResult

by teamnova 2023. 12. 25.
728x90

앱을 만들때, 새로운 액티비티를 만들고, 값을 입력한 뒤 액티비티를 종료하여 원래 액티비티로 돌아올 때 

입력했던 데이터를 적용해야 하는 경우가 자주 생깁니다. 

이런 기능은 startActivityForResult() 메서드 또는ActivityResultLauncher 를 이용해서 해결할 수 있습니다. 

 

안드로이드를 처음 하시는 분들은 먼저 startActivityForResult()를 사용해 보시고, 동작을 익힌 뒤   ActivityResultLauncher 시간이 되신다면 까지 해보시는걸 추천드립니다. 

 

오늘은 예제를 통해 startActivityForResult() 동작을 확인해 보겠습니다. 

전체 코드는 마지막에 첨부해드리겠습니다.

 

1. 먼저, 새로운 액티비티인 SubActivity를 만듭니다. 

public class SubActivity extends AppCompatActivity {
    
    Button button;
    EditText editText;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        button = findViewById(R.id.button);
        editText = findViewById(R.id.editText);
        
        // 버튼클릭
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String getName = editText.getText().toString(); // 입력한 이름을 가져옴 

                Intent intent = new Intent();  // 인텐트 객체 생성
                intent.putExtra("name",getName); // 위에서 가져온 데이터를 인텐트에 넣기
                setResult(RESULT_OK,intent); // 응답 보내기 
                finish(); // 현재 액티비티 종료 
            }
        });
    }
}

 

setResult() 메서드를 호출할 때 인텐트 객체가 파라미터로 전달됩니다.  setResult() 메서드는 새로 띄운 액티비티 (SubActivity)에서 원래 액티비티(MainActivity)로 인텐트를 전달하고 싶을 때 사용하는 메서드로 호출 형식은 다음과 같습니다. 

 

setResult(응답코드, 인텐트)

 

이 응답코드와 인텐트는 새 액티비티를 띄웠던 원래 액티비티 (MainActivity)에 전달됩니다.

 

 

2. MainActivity 에서 SubActivity를 띄우기 

public class MainActivity extends AppCompatActivity {
    Button newAct_btn;
    final int RequestCode = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        newAct_btn = findViewById(R.id.newAct_btn);

        newAct_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),SubActivity.class);
                startActivityForResult(intent,RequestCode);
            }
        });

    }
}

새로운 액티비티를 띄울 때  startActivityForResult() 메서드를 호출합니다. 

startActivity() 메서드는 새로운 액티비티를 띄우기만 하지만

startActivityForResult()  는 새 액티비티를 띄우고 응답을 받을 수 있습니다. 

파라미터 값인 RequestCode는 새 액티비티를 띄울 때 전달하는 요청코드입니다. 

이 값은 나중에 새 액티비티로부터 데이터를 응답받을 때 다시 전달받게 됩니다. 

이 값으로 어떤 액티비티로부터 온 응답인지 구별할 수 있습니다.

 

 

3. 응답을 처리하는 메서드 추가합니다.

이제 새로 띄운 SubActivity에서 응답을 처리하는 메서드를 추가합니다. 

MainActivity 안에 커서를 클릭하고 오른쪽 마우스 버튼을 누르면 팝업 메뉴가 보입니다. [ Generate -> Override Methods ] 메뉴를 누릅니다.

 

OR

MainActivity 안에 커서를 클릭하고 Ctrl + O 를 눌러도 똑같은 아래의 화면이 나옵니다. 

 

이제 onActivityResult()메서드를 찾아서 [Ok] 버튼을 누릅니다 

 

 

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

첫번째 파라미터 requestCode는 새로운 액티비티를 띄울 때 보냈던 요청 코드 입니다. 

이 값으로 부터 어떤 액티비티로부터 응답을 받은 것인지 구분이 가능합니다. 

 

두번째 파라미터 resultCode는 SubActivity에서 setResult() 메서드로 전달했던 응답코드입니다. 

이 응답코드로 새 액티비티에서 처리한 결과가 정상인지 아닌지 구분하려고 사용됩니다. 

 

세 번째 파라메터 data는 새로운 액티비티 였던 SubActivity에서 전달받은 인텐트입니다. 

 

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

    if(requestCode == RequestCode){
        if (resultCode == RESULT_OK){
            String name = data.getStringExtra("name"); // 전송받은 name값을 가져옵니다.
            response_tv.setText(name); // 텍스트뷰에 전달받은 name을 표시합니다.
        }
    }
}

 

 

이제 앱을 실행해서 동작을 확인해 보세요 . 

메인 액티비티에서 "새 액티비티 띄우기 "버튼을 누르면 SubActivity가 띄워지고 이름을 입력한 뒤 종료하기 버튼을 누르면 메인 액티비티로 돌아가게되고, 텍스트뷰에 데이터가 표시됩니다. 

 

 

 

다음은 코드 본문입니다. 

 

MainActivity

public class MainActivity extends AppCompatActivity {


    Button newAct_btn;
    TextView response_tv;
    final int RequestCode = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        newAct_btn = findViewById(R.id.newAct_btn);
        response_tv = findViewById(R.id.response_tv);

        newAct_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),SubActivity.class);
                startActivityForResult(intent,RequestCode);
            }
        });

    }


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

        if(requestCode == RequestCode){
            if (resultCode == RESULT_OK){
                String name = data.getStringExtra("name"); // 전송받은 name값을 가져옵니다.
                response_tv.setText(name);
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/newAct_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="125dp"
        android:layout_marginTop="327dp"
        android:text="새 액티비티 띄우기"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/response_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="104dp"
        android:layout_marginBottom="80dp"
        android:text="전달받은 값이 들어갈 뷰"
        android:textColor="@color/black"
        android:textSize="20sp"
        app:layout_constraintBottom_toTopOf="@+id/newAct_btn"
        app:layout_constraintStart_toStartOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

 

SubActivity

public class SubActivity extends AppCompatActivity {

    Button button;
    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        button = findViewById(R.id.button);
        editText = findViewById(R.id.editText);

        // 버튼클릭
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String getName = editText.getText().toString(); // 입력한 이름을 가져옴

                Intent intent = new Intent();
                intent.putExtra("name",getName);
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SubActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="158dp"
        android:layout_marginTop="288dp"
        android:text="종료하기"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="97dp"
        android:layout_marginBottom="70dp"
        android:ems="10"
        android:inputType="text"
        android:hint="이름을 입력하세요"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>