[Android] 화면 간 전환하기, 인텐트(Intent)
모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다.
화면 간 전환
(1) 액티비티를 화면에 띄우는 경우과 (2) 어떤 액티비티를 띄운 것인지와 그 액티비티로부터 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리하는 경우가 있다. 다음과 같은 상황에서는 각각 해당 메서드를 사용한다.
- startAcitivy() 메서드
- startActivityForResult() 메서드
startActivityForResult()
startActivityForResult(Intent intent, int requestCode)
새 액티비티에서 원래의 액티비티로 돌아오면서 새 액티비티의 응답을 받아 처리해야 하는 경우에는 어떤 액티비티에서 돌아온 응답인지 구분해야 이 응답을 처리할 수 있다. 이 응답을 구분하기 위한 파라미터가 정수로 된 코드값(requestCode).
ActivityResponse.java
setResult()
setResult(int resultCode, Intent 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();
}
});
}
}
- R.id.button_response 라는 버튼 객체를 참조함
- 인텐트 객체를 생성하고, name의 값을 부가 데이터로 넣음
- setResult()로 응답 보냄
- 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();
}
}
}
서로 간에 상태 코드나 데이터를 주고 받는 과정 정리
- 새로운 액티비티 만들기
- 새로운 액티비티의 XML 레이아웃 정의하기
- 메인 액티비티에서 새로운 액티비티 띄우기 - startActivityForResult()
- 새로운 액티비티에서 응답 보내기 - setResult()
- 응답 처리하기 - onActivityResult()
인텐트에 대한 더 자세한 내용은 다음 포스팅에 :)