ANDROID/Android 앱 프로그래밍

[Android] 화면 간 전환하기, 인텐트(Intent)

주 녕 2021. 5. 20. 17:07
반응형

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 

 

화면 간 전환

(1) 액티비티를 화면에 띄우는 경우과 (2) 어떤 액티비티를 띄운 것인지와 그 액티비티로부터 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리하는 경우가 있다. 다음과 같은 상황에서는 각각 해당 메서드를 사용한다.

  1. startAcitivy() 메서드
  2. startActivityForResult() 메서드

startActivityForResult()

startActivityForResult(Intent intent, int requestCode)

새 액티비티에서 원래의 액티비티로 돌아오면서 새 액티비티의 응답을 받아 처리해야 하는 경우에는 어떤 액티비티에서 돌아온 응답인지 구분해야 이 응답을 처리할 수 있다. 이 응답을 구분하기 위한 파라미터가 정수로 된 코드값(requestCode).

 

 

ActivityResponse.java

setResult()

setResult(int resultCodeIntent intent)

새로 띄운 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 때 사용하는 메서드

첫번째 파라미터로 응답 코드를 전달할 수 있는데, 이 응답 코드와 인텐트는 새 액티비티를 띄운 원래 액티비티에 전달됨.

public class ActivityResponse extends AppCompatActivity {

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

        Button button = findViewById(R.id.button_response);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("name", "june");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}
  1. R.id.button_response 라는 버튼 객체를 참조함
  2. 인텐트 객체를 생성하고, name의 값을 부가 데이터로 넣음
  3. setResult()로 응답 보냄
  4. finish()로 현재 액티비티 없앰
    • 액티비티를 현재 화면에서 없애고 싶을 때 사용함

 

ActivityRequest.java

public class ActivityRequest extends AppCompatActivity {
    public static final int REQUEST_CODE = 101;

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

        Button button = findViewById(R.id.button_request);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), ActivityResponse.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }
}
  • 새로운 액티비티를 띄울 때 startactivityForResult() 메서드로 호출함
  • 상수 REQUEST_CODE는 새 액티비티를 띄울 때 보낼 요청 코드
    • 코드 값은 마음대로 지정해도 되지만, 중복되지 않은 값으로 정해야 함
    • 나중에 새 액티비티로부터 응답을 받을 때 다시 전달받을 값임 (어떤 액티비티로 부터 온 응답인지 구분)
  • 인텐트 객체를 만들고 startActivityForResult() 메서드에서 호출함

 

onActivityResult()

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

: 새로 띄운 액티비티로부터 받은 응답을 처리하는 메서드

ActivityRequest 클래스 안에 마우스를 둔 상태에서 마우스 우클릭 → Generate → Override Methods 메뉴 → onActivityResult 선택

또는 Ctrl+O 에서 onActivityResult 선택

  • requestCode : 액티비티를 띄울 때 전달했던 요청코드와 같음
    • 어떤 액티비티로부터 응답을 받은 것인지 구분할 수 있음
  • resultCode : 새 액티비티로부터 전달된 응답코드
    • 보통 Activity.RESULT_OK 상수를 전달하는 방법으로 정상 처리임을 알림
    • 성공인 경우 200, 실패인 경우 400으로 하는 등으로 임의로 만든 코드를 전달할 수 있음
  • intent : 새 액티비티로부터 전달받은 인텐트
    • 새 액티비티의 데이터를 전달할 수 있음
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        if (requestCode == REQUEST_CODE) {
            Toast.makeText(getApplicationContext(), "onActivityResult 메서드 호출됨. 요청코드: " + requestCode + 
                    "결과 코드 : "+resultCode, Toast.LENGTH_SHORT).show();
            
            if (resultCode == RESULT_OK) {
                String name = data.getStringExtra("name");
                Toast.makeText(getApplicationContext(), "응답으로 전달된 name : "+name, Toast.LENGTH_SHORT).show();
            }
        }
    }

 

서로 간에 상태 코드나 데이터를 주고 받는 과정 정리

  1. 새로운 액티비티 만들기
  2. 새로운 액티비티의 XML 레이아웃 정의하기
  3. 메인 액티비티에서 새로운 액티비티 띄우기 - startActivityForResult()
  4. 새로운 액티비티에서 응답 보내기 - setResult()
  5. 응답 처리하기 - onActivityResult()

 

인텐트에 대한 더 자세한 내용은 다음 포스팅에 :)

반응형