본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오]액티비티 간의 백버튼 누를 때 데이터 전달 방법

안드로이드 개발에서는 액티비티 간에 데이터를 주고받을 때 백버튼을 눌렀을 때도 데이터를 전달할 수 있다. 이 섹션에서는 MainActivity에서 SecondActivity로 데이터를 전달하고, SecondActivity에서 백버튼을 눌렀을 때 처리된 결과를 다시 MainActivity로 반환받는 방법을 설명한다.

MainActivity.java

package com.kks.lifecycle;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    Button button;
    EditText editName;
    EditText editAge;
    TextView txtAge;

    ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == Activity.RESULT_OK) {
                        Intent data = result.getData();
                        if (data != null) {
                            int age = data.getIntExtra("age", 0);
                            txtAge.setText("10년 후 나이는 " + age + "세");

                            // 백버튼 눌렀을 때 동작하는 코드 작성
                            getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
                                @Override
                                public void handleOnBackPressed() {
                                    Intent intent = new Intent();
                                    intent.putExtra("age", age);
                                    setResult(Activity.RESULT_OK, intent);
                                    finish();
                                }
                            });
                        }
                    }
                }
            });

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

        button = findViewById(R.id.button);
        editName = findViewById(R.id.editName);
        editAge = findViewById(R.id.editAge);
        txtAge = findViewById(R.id.txtAge);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editName.getText().toString().trim();
                String strAge = editAge.getText().toString().trim();
                int age = Integer.parseInt(strAge);

                // Intent를 생성하여 데이터를 SecondActivity로 전달한다
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("name", name);
                intent.putExtra("age", age);
                launcher.launch(intent);
            }
        });
    }
}

주요 코드 설명:

  • getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) - 백버튼이 눌렸을 때의 동작을 정의한다.
  • intent.putExtra("age", age); - 데이터를 인텐트에 추가한다.
  • setResult(Activity.RESULT_OK, intent); - 결과를 설정한다.
  • finish(); - 현재 액티비티를 종료한다.

SecondActivity.java

package com.kks.lifecycle;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    TextView txtName;
    TextView txtAge;
    int age;

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

        txtName = findViewById(R.id.txtName);
        txtAge = findViewById(R.id.txtAge);

        // MainActivity로부터 전달받은 데이터를 받는다
        String name = getIntent().getStringExtra("name");
        age = getIntent().getIntExtra("age", 0);

        age = age + 10;

        txtName.setText("이름은 " + name);
        txtAge.setText("10년 후 나이는 " + age + "세");
    }

    @Override
    public void onBackPressed() {
        // 데이터를 반환한다
        Intent resultIntent = new Intent();
        resultIntent.putExtra("age", age);
        setResult(Activity.RESULT_OK, resultIntent);
        super.onBackPressed();
    }
}

주요 코드 설명:

  • age = age + 10; - 받은 나이에 10을 더한다.
  • Intent resultIntent = new Intent(); - 반환할 데이터를 담을 인텐트를 생성한다.
  • resultIntent.putExtra("age", age); - 데이터를 인텐트에 추가한다.
  • setResult(Activity.RESULT_OK, resultIntent); - 결과를 설정한다.
  • super.onBackPressed(); - 뒤로가기 버튼을 눌렀을 때의 기본 동작을 실행한다.