ActivityResultLauncher와 Intent는 Android에서 액티비티 간의 데이터 전달 및 정보 교환을 처리하는 중요한 도구입니다.
이 두 가지를 사용하여 액티비티 간 양방향 데이터 교환을 할 수 있습니다.
1. Intent
Intent는 액티비티 간의 데이터 전달을 위해 사용되는 기본적인 방법입니다.
Intent는 애플리케이션 간 또는 애플리케이션 내 액티비티 간에 데이터를 전달하고 액티비티를 시작할 수 있도록 합니다.
주요 역할:
- 액티비티 간 데이터 전달: Intent를 통해 하나의 액티비티에서 다른 액티비티로 데이터를 전달할 수 있습니다.
- 액티비티 시작: Intent를 사용하여 새로운 액티비티를 시작하거나 결과를 요청할 수 있습니다.
Intent를 사용하여 액티비티 간 데이터 전달 예시:
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = editTitle.getText().toString().trim();
String body = editBody.getText().toString().trim();
if (title.isEmpty() || body.isEmpty()) {
Toast.makeText(PostActivity.this, "제목과 내용을 입력해주세요.", Toast.LENGTH_SHORT).show();
} else { //메인액티비티에게 데이터 전달.
Intent intent = new Intent();
Memo memo = new Memo();
memo.title = title;
memo.body = body;
intent.putExtra("memo", memo); //메모클래스가서 임폴트 시리얼라이즈드하기
setResult(100, intent);
finish();
}
}
});
intent.putExtra("memo", memo):
putExtra()로 Intent 객체에 데이터를 추가하는 메서드입니다. 여기서는 memo라는 키로 Memo 객체를 전달하고 있습니다.
사용자가 제목과 본문을 입력하고 저장 버튼을 클릭하면 입력된 내용이 Memo 객체로 만들어지고, 메인 액티비티에 전달됩니다.
Intent를 사용하여 데이터를 다른 액티비티로 전달, 이동 예시:
// Activity A에서 Activity B로 데이터 전송 및 Activity B 시작
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("key", "value"); // 데이터 추가
startActivity(intent); // Activity B 시작
2. ActivityResultLauncher
액티비티 간의 데이터 교환 및 결과 반환을 더 안전하고 효율적으로 처리할 수 있습니다.
액티비티 결과 반환 외에 파일선택, 권한 요청등 다양한 작업에 활용할 수 있습니다.
2.1. ActivityResultLauncher 사용법
ActivityResultLauncher를 사용하려면 먼저 ActivityResultContracts.StartActivityForResult()를 사용하여 액티비티 결과 계약을 정의해야 합니다.
//양방향으로 데이터를 주고받기 위한 런처
public ActivityResultLauncher<Intent> launcher=
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>(){
@Override
public void onActivityResult(ActivityResult o) {
if(o.getResultCode()==100){
Memo memo=(Memo)o.getData().getSerializableExtra("memo");
memoArrayList.add(0,memo);
adapter.notifyDataSetChanged();
}
else if(o.getResultCode()==101){
Memo memo=(Memo) o.getData().getSerializableExtra("memo");
int index=o.getData().getIntExtra("index",-1);
memoArrayList.set(index,memo);
adapter.notifyDataSetChanged();
}
}
});
//버튼 누르면 PostActivity로 이동
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,PostActivity.class);
launcher.launch(intent);
}
});
ActivityResultLauncher<Intent> filePickerLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData();
Uri fileUri = data.getData();
// 파일 처리 로직
}
}
});
// 버튼 클릭 시 파일 선택 실행
filePickerButton.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("*/*");
filePickerLauncher.launch(intent);
});
ActivityResultLauncher와 Intent를 사용하면 액티비티 간의 데이터 교환과 결과 반환 처리가 훨씬 깔끔하고 효율적으로 처리됩니다. .