본문 바로가기
Aandroid Studio/기능

[android] 액티비티간, 단방향 전달, 백버튼 누를때 전달 방법

by 코끼리똥11 2024. 6. 7.

액티비티간 단방향 데이터 전달 방법

 

MainActivity

public void onClick(View v) {
                String name = editName.getText().toString().trim();
                String strAge= editAge.getText().toString().trim();

                // 다른 액티비티를 실행시키는 코드
                // 인텐트를 만든다.
                // 인텐트란, 어떤 엑티비티가 어떤 엑티비티를 띄우겠다 라는 (의도)
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                // 액티비티에 데이터를 전달하는 방법
                int age = Integer.parseInt(strAge);
                intent.putExtra("name",name);
                intent.putExtra("age",age);
                startActivity(intent);
                
            }

 

 

  1. Intent intent = new Intent(MainActivity.this, SecondActivity.class);:
    • 새로운 인텐트 객체를 생성합니다. 이 인텐트는 현재 액티비티(MainActivity)에서 다른 액티비티(SecondActivity)로 이동할 것임을 나타냅니다.
      • MainActivity.this:
        • 안드로이드 액티비티 내에서 다른 클래스나 메서드에서 현재 액티비티를 참조할 때 사용합니다.
        • this 키워드는 현재 객체를 가리키는 참조를 제공합니다. 여기서 MainActivity는 현재 액티비티를 나타냅니다.
        • 따라서 MainActivity.this는 현재 액티비티를 가리키는 참조를 제공하며, 인텐트를 생성하는 데 사용됩니다.
      • SecondActivity.class:
        • 액티비티 클래스의 객체가 아니라 클래스 자체를 참조하는 것입니다.
        • class 키워드는 클래스의 메타데이터를 나타냅니다. SecondActivity.class는 SecondActivity 클래스를 나타내며, 이 클래스의 정보를 인텐트에 전달합니다.
        • 이를 통해 안드로이드 시스템이 SecondActivity 클래스를 인식하고 해당 액티비티를 시작할 수 있습니다.
  2. intent.putExtra("name",name);:
    • 생성한 인텐트에 추가 데이터를 넣습니다. 여기서 "name"은 데이터를 식별하는 키이며, name 변수에 저장된 사용자의 이름을 값으로 가집니다. 이것은 두 번째 액티비티로 전달될 것입니다.
  3. intent.putExtra("age",age);:
    • 위와 마찬가지로, "age"라는 키로 사용자의 나이(age 변수)를 추가 데이터로 인텐트에 넣습니다.
  4. startActivity(intent);:
    • 생성된 인텐트를 사용하여 다른 액티비티(SecondActivity)를 시작합니다. 이는 사용자의 입력된 이름과 나이가 포함된 데이터와 함께 해당 액티비티로 전달됩니다.

이렇게 함으로써 인텐트를 사용하여 데이터를 포함한 정보를 다른 액티비티로 전달하고, 해당 액티비티를 시작할 수 있습니다. 이것이 안드로이드에서 데이터를 전달하고 액티비티를 시작하는 가장 일반적인 방법 중 하나입니다.

 

 

secondActivity

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.i("LIFE MAIN", "두번째 엑티비티 onCreate 실행");

        // 데이터가 넘어온게 있으면, 데이터를 받아준다.
        String name=getIntent().getStringExtra("name");
        age=getIntent().getIntExtra("age",0);
        textName = findViewById(R.id.textName);
        textAge = findViewById(R.id.textAge);
        age=age+10;
        textName.setText("이름은" + name);
        textAge.setText("나이는" + age+"세");

 

 

 

백버튼 데이터 전달방법

secondActivity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.i("LIFE MAIN", "두번째 엑티비티 onCreate 실행");

        // 데이터가 넘어온게 있으면, 데이터를 받아준다.
        String name=getIntent().getStringExtra("name");
        age=getIntent().getIntExtra("age",0);
        textName = findViewById(R.id.textName);
        textAge = findViewById(R.id.textAge);
        age=age+10;
        textName.setText("이름은" + name);
        textAge.setText("나이는" + age+"세");
        // 백버튼 눌렀을때 동작하는 함수
        getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                Intent intent = new Intent();
                intent.putExtra("age",age);
                setResult(1000,intent);
                finish();
            }
        });

 

 

 

MainActivity

 

public class MainActivity extends AppCompatActivity {
    Button button;
    TextView textView;

    EditText editName;

    EditText editAge;
    TextView txtAge;

    ActivityResultLauncher<Intent> launcher =
            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                    new ActivityResultCallback<ActivityResult>() {
                        @Override
                        public void onActivityResult(ActivityResult o) {
                            // 내가 실행한 액티비티로 부터 , 데이터를 받아오는 부분
                            if ( o.getResultCode() == 1000){
                                int age = o.getData().getIntExtra("age",0);
                                txtAge.setText("10년후 나이는"+ age + "살");
                            }
                        }
                    });
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("LIFE MAIN", "onCreate 실행");

        button= findViewById(R.id.button);
        textView = findViewById(R.id.textView);
        editAge = findViewById(R.id.editAge);
        editName = findViewById(R.id.editName);
        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();

                // 다른 액티비티를 실행시키는 코드
                // 인텐트를 만든다.
                // 인텐트란, 어떤 엑티비티가 어떤 엑티비티를 띄우겠다 라는 (의도)
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                // 액티비티에 데이터를 전달하는 방법
                int age = Integer.parseInt(strAge);
                intent.putExtra("name",name);
                intent.putExtra("age",age);
                launcher.launch(intent);
                // startActivity(intent);

            }

 

코드 바뀐거 주의


launcher.launch(intent);
// startActivity(intent);

 

위 코드는 ActivityResultLauncher를 사용하여 다른 액티비티로부터 결과를 받아와 처리하는 부분을 담고 있습니다. 여기서 onActivityResult 메서드는 실행 결과를 처리하는 콜백 함수로, 실행 결과를 ActivityResult 객체인 o에 전달받습니다.

 

if (o.getResultCode() == 1000)는 실행 결과 코드가 1000일 때만 데이터를 처리하는 조건문입니다. 이는 실행한 액티비티에서 특정 결과 코드를 설정하여 반환했을 때만 데이터를 처리하고 화면에 표시합니다.

 

int age = o.getData().getIntExtra("age", 0);는 실행 결과에서 "age"라는 키로 전달된 데이터를 가져와 정수형으로 변환하는 부분입니다. 만약 데이터가 전달되지 않았거나 형식이 올바르지 않을 경우 기본값으로 0을 사용합니다.