프로그래밍 언어/Java

[ANDROID / JAVA] Activity 간 화면 전환

차나히 2023. 5. 11. 16:32

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 에서 데이터를 받아오는 작업이 가능해진다.