본문 바로가기
Android

[Android] 엑티비티 간의 데이터 전달: putExtra, getIntent, getStringExtra, getIntExtra, startActivityForResult, ActivityResultLauncher, ActivityResultCallback

by eyoo 2022. 7. 13.

엑티비티 간 데이터를 전달할수있다.

 

먼저 메인 엑티비티에서 intent의 putExtra로 데이터를 전달한다.

 

                Intent intent = new Intent(MainActivity.this, SecondActivity.class);

                intent.putExtra("email",email);
                intent.putExtra("name",name);
                intent.putExtra("age",age);
                intent.putExtra("hiddenData",hiddenData);

                // 데이터만 전달하는 경우
                startActivity(intent);

# 먼저 Intent 객체 생성하고 그 후에 putExtra를 사용해서 데이터를 넘겨준다.

# putExtra의 첫번째 파라미터는 넘겨주는 데이터의 키 값이며 두번째 파라미터로 데이터가 들어있는 변수를 지정해줬다.

 

 

정보를 받을 두번째 엑티비티에서 getIntent와 getExtra 형식의 코드로 데이터를 받자.

 

        String email = getIntent().getStringExtra("email");
        String name = getIntent().getStringExtra("name");
        int age = getIntent().getIntExtra("age",0);
        double hiddenData = getIntent().getDoubleExtra("hiddenData",0.0);

# 먼저 getIntent로 Intent를 가져온다

# 그리고 데이터 타입에 맞게 getStringExtra, getIntExtra, getDoubleExtra 등으로 메인에서 설정한 키 값을 불러 데이터를 가져온다.

# 숫자형식은 두번째 파라미터가 필요하며 가져올 값이 없을때 들고 올 수를 넣어준다.

 

 

이제 실행한 엑티비티로부터 데이터를 전달받는 코드를 메인에 작성한다.

 

startActivityForResult는 deprecated 되었다.

# deprecated는 안드로이드 버전이 바뀌어 이제 곧 사라질 예정이라는 뜻이다. 

 

그래서 registerForActivityResult를 ActivityResultLauncher에 캐스팅하여 진행해야 한다.

 

   // 내가 실행한 엑티비티 부터 데이터를 받아와서 처리하는 코드
    ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == 0){
                        int age = result.getData().getIntExtra("age",0);
                        editAge.setText(""+age);
                    }

                }
            });

# registerForActivityResult의 첫번째 파라미터로는 deprecated된 startActivityForResult 를

# 두번째 파라미터에는 ActivityResultCallback를 넣는데 그러면 자동으로 오버라이드 된다.

# result에는 resultCode가 있으며 resultCode의 값으로 여러가지의 데이터타입을 구분해서 사용가능하다.

 

 

이제 두번째 엑티비티에서 버튼을 누르면 editText에서 입력한 데이터가 다시 메인 엑티비티로 갈수있도록 작성한다.

 

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String ageStr = editAge.getText().toString().trim();
        int age = Integer.valueOf(ageStr).intValue();

        Intent intent = new Intent();
        intent.putExtra("age",age);
        setResult(0,intent);

        finish();
    }
});

# EditText에 있던 데이터를 getText와 toString으로 문자화 하여 가져온다.

# 문자화 된 데이터를 valueOf와 intValue를 통해 다시 정수로 바꾼다.

# 이제 Intent를 객체생성하고 putExtra로 전닿한다.

# 여기서 setResult로 result를 하고 finish로 창이 닫히도록 한다.

 

 

메인에서는 위에서 변수 설정한 받아오는 코드 startActivityResult로 launch해서 두번째 엑티비티를 열수 있도록 한다.

 

startActivityResult.launch(intent);

 

 

더보기

 

사용된 앱:

# 이메일, 이름, 나이 데이터를 주고 받을수있는 테스트앱

 

 메인 엑티비티

 

public class MainActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editName;
    EditText editAge;
    Button button;


    // 내가 실행한 엑티비티 부터 데이터를 받아와서 처리하는 코드
    ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {

                    // result에는 resultCode가 있다.
                    // resultCode의 값으로 여러가지 구분해서 사용가능
                    if (result.getResultCode() == 0){
                        int age = result.getData().getIntExtra("age",0);
                        editAge.setText(""+age);
                    }

                }
            });


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

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

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String email = editEmail.getText().toString().trim();
                String name = editName.getText().toString().trim();
                String ageStr = editAge.getText().toString().trim();

                int age = Integer.valueOf(ageStr).intValue();

                double hiddenData = 3.1414;

                Intent intent = new Intent(MainActivity.this, SecondActivity.class);

                intent.putExtra("email",email);
                intent.putExtra("name",name);
                intent.putExtra("age",age);
                intent.putExtra("hiddenData",hiddenData);

                // 데이터만 전달하는 경우
//                startActivity(intent);

                // 다시 실행한 엑티비티로 부터 데이터를 전달받는 경우 (위에서 캐스팅)
                // startActivityForResult(intent)
                startActivityResult.launch(intent);




            }
        });
    }
}

 

세컨드 엑티비티

 

public class SecondActivity extends AppCompatActivity {

    TextView txtEmail;
    TextView txtName;
    EditText editAge;
    Button button;

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

        // 메인에서 온 데이터를 받아준다.
        // Intent를 가져온다.
        String email = getIntent().getStringExtra("email");
        String name = getIntent().getStringExtra("name");
        int age = getIntent().getIntExtra("age",0);
        double hiddenData = getIntent().getDoubleExtra("hiddenData",0.0);

        txtEmail = findViewById(R.id.txtEmail);
        txtName = findViewById(R.id.txtName);
        editAge = findViewById(R.id.editAge);
        button = findViewById(R.id.button);

        // 데이터를 화면에 세팅
        txtEmail.setText(email);
        txtName.setText(name);
        editAge.setText(age+"");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String ageStr = editAge.getText().toString().trim();
                int age = Integer.valueOf(ageStr).intValue();

                Intent intent = new Intent();
                intent.putExtra("age",age);
                setResult(0,intent);

                finish();
            }
        });



    }
}

 

 

 

 

 

 

 

 

댓글