[ANDROID / JAVA] Activity 간 화면 전환
Activity 간 화면전환
Intent 라는 객체를 이용하면 Activity 간의 화면전환이 가능해진다. 이번 포스팅에서는 Intent 를 이용하여 Activity 간의 화면을 전환하는 방법과 Activity 간 데이터를 전달하는 방법, 그리고 데이터를 다시 받아올 수 있는 방법에 대해 알아보자.
먼저, Activity 간 화면 전환 코드를 보자. XML 레이아웃 코드는 따로 작성하지 않고 자바 코드만 보자.
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
});
}
}
버튼을 누르면, SecondActivity 로 이동하는 코드이다.
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
위 코드를 이용하면 Intent 객체를 생성할 수 있으며, 객체 생성자 파라미터로 context 객체 하나와 이동할 Activity 의 클래스 정보가 필요하다. 이렇게 인텐트 객체를 만들어 놓았으면 이제 실제로 이동시킬 코드가 필요하다.
startActivity(intent);
만들어진 intent 객체를 startActivity() 메서드에게 파라미터로 전달하면 이제 실제로 Activity 를 이동할 수 있게된다.
Activity 간 데이터 전달
데이터 보내기
앱을 만들다 보면, 단순하게 화면만 전환하는 경우보다는 Activity 전환 시에 데이터 전달이 필요한 경우가 상당히 많다. Intent 를 이용하면 데이터의 전달도 손쉽게 가능하다. 코드로 보자.
Intent intent = new Intent(getApplicationContext(), SecondActivity.class).putExtra("Data",10000);
위에서 봤던 Intent 객체 생성 코드이다. 생성된 인텐트 객체에 putExtra() 메서드를 이용하여 데이터를 Intent 객체에 포함시킬 수 있다. 첫번째 파라미터에는 식별자 ID 값을 전달하고 두번째 파라미터에는 전달하고자 하는 데이터를 넣어주면 된다. 식별자 ID 는 이 Intent 를 받는 Activity 에서 사용하는 ID 값이다. 뒤에서 더 살펴보도록 하자. 일단 이렇게 데이터를 Intent 에 포함시켜 준 뒤, startActivity() 로 Activity 를 실행시켜 주면 데이터는 무사히 잘 전달할 수 있게된다.
데이터 받기
다음 코드를 보자.
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int result = getIntent().getIntExtra("Data",0);
}
}
SecondActivity 의 자바코드 이며, MainAcitivity 에서 보낸 Intent 객체를 getIntent() 를 이용해 받아왔다.
getIntExtra("Data",0)
위 코드는 보낸 데이터를 꺼내올 수 있는 메서드 이다. 첫번째 파라미터는 보낼 때 설정했던 데이터의 식별자 ID 이며, 이 ID 값이 동일해야 데이터를 꺼내올 수 있다. 두번째 파라미터는 기본값인데, 만약에 보낸 데이터가 없다면 기본값을 지정할 수 있다.
데이터 받아오기
예를 들어, 앨범에서 사진을 선택하는 작업을 한다고 하자. 이때, 사용자는 앨범에서 사진을 선택하고 앨범을 종료시키면 사진을 가져올 수 있다. 앨범을 하나의 Activity 라고 생각한다면, 원래의 Activity 에서 앨범 Activity 로 화면을 전환시켜 사진을 선택하고 사진의 데이터를 받아온 결과가 된다. 이런 과정은 어떻게 이루어지는지 간단한 예제를 통해 알아보자.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn);
button.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), SecondActivity.class).putExtra("Data",10000);
launcher.launch(intent);
});
}
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == RESULT_OK){
int data = result.getData().getIntExtra("Data",0);
}
}
});
일단 Intent 를 이용하여 다른 Activity 의 데이터를 가져와야 하는건 맞다. 다만, 기존의 방식과는 다르게 ActivityResultLauncher 를 이용해야한다.
registerForActivityResult( ) 는 ActivityResultContract 및 ActivityResultCallback을 가져와서 다른 활동을 실행하는 데 사용할 ActivityResultLauncher를 반환한다.
ActivityResultContract는 결과를 생성하는 데 필요한 입력 유형과 결과의 출력 유형을 정의한다. 이 API는 사진 촬영, 권한 요청 등과 같은 기본 인텐트 작업의 기본 컨트랙트를 제공합니다. 말 그대로 계약 정도로 생각해도 좋을것 같다. 위 예제에서는 기본적인 인텐트 작업을 할 예정이므로, StartAcitivityForResult() 로 계약 유형을 설정해주었다.
ActivityResultCallback은 ActivityResultContract에 정의된 출력 유형의 객체를 가져오는 onActivityResult() 메서드가 포함된 단일 메서드 인터페이스이다. 이 메서드를 이용하여 데이터를 돌려받아 처리할 수 있게된다.
다음 코드는 SecondActivity 의 코드이다.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int result = getIntent().getIntExtra("Data",0);
Intent intent = new Intent(this,MainActivity.class).putExtra("Data",result);
setResult(RESULT_OK,intent);
finish();
}
Intent 를 이용해 다른 Activity 에 데이터를 전달할 때와 마찬가지로 putExtra 를 이용하여 데이터를 Intent 에게 넣어놓는다. 그 이후, setResult(RESULT_OK, intent) 와 finish() 를 이용해 MainActivity 에게 다시 데이터를 전달할 수 있다. RESULT_OK 는 MainActivity 의 launcher 가 받을 결과 코드이고, intent 는 MainActivity 로 보낼 intent 객체를 의미한다. 이렇게 하면 다른 Activity 에서 데이터를 받아오는 작업이 가능해진다.