반응형
이번 포스팅에서 설명하고 시현한 앱은 깃허브에서 다운로드 가능합니다.
https://github.com/luvris2/Android-MultiActivityDataTest-App
액티비티 간 단방향 데이터 전달
다른 액티비티에게 데이터 전달하는 소스 코드
1. Intent 객체 생성
- 객체 생성시 지금의 액티비티(this)와 대상이 될 액티비티(class)를 설정
2. putExtra("key", value) : 메소드에 키와 밸류 데이터 입력
// MainActivity
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("dataKey", dataValue);
다른 액티비티로부터 데이터를 전달 받는 소스 코드
1. getIntent().getStringExtra("key") : 메소드에 키 데이터 입력
- 주의 : 전달 받는 데이터타입에 맞춰야 함. 정수형일 경우 getIntString();
// OtherActivity
String getData = getIntent().getStringExtra("dataKey");
액티비티 간 양방향 데이터 전달
- 양방향 데이터 전달시 두 가지의 방법이 존재
- startActivityForResult 메소드를 이용하는 방법 (구버전)
- ActivityResultLauncher 메소드를 사용하는 방법 (신버전)
1. 데이터를 startActivityForResult를 사용하여 전달받는 방법
다른 액티비티로 이동하고 이동된 액티비티가 종료 될 때 데이터 전달받는 소스 코드
1. Intent 객체 생성
- 객체 생성시 지금의 액티비티(this)와 대상이 될 액티비티(class)를 설정
2. startActivityForResult(Intent, requestCode) : 인텐트 객체와 리퀘스트 코드 입력
- 리퀘스트 코드는 데이터를 다른 액티비티의 데이터를 전달 받을 경우 구분을 위한 코드
3. onActivityResult 메소드 오버라이드
- startActivityForResult에서 전달 받은 값(키로 호출)과 리퀘스트 코드 접근 하는 메소드
- 주의 : onCreate() 메소드가 아닌 다른 영역에서 오버라이드 해야 함
- 데이터 전달(반환값)이 성공적이면 리퀘스트 코드는 0
- 전달 받은 값은 리퀘스트 코드 0으로 구분하여 코드 작성 (조건문 이용)
// MainActivity
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(intent, 0);
// MainActivity Override Method Define
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
String dataValue = data.getStringExtra("dataKey");
TextView txt = findViewById(R.id.TextView);
txt.setText(dataKey);
}
}
2. 데이터를 ActivityResultLauncher를 사용하여 전달받는 방법
다른 액티비티로 이동하고 이동된 액티비티가 종료 될 때 데이터 전달받는 소스 코드
3. onActivityResult 메소드 오버라이드
- startActivityResult.launch(Intent)에서 전달 받은 값(키로 호출)과 리퀘스트 코드 접근 하는 메소드
- 확인 : startActivityResult는 ActivityResultLauncher의 객체를 임의로 지정한 이름
- 주의 : onCreate() 메소드가 아닌 다른 영역에서 오버라이드 해야 함
- 데이터 전달(반환값)이 성공적이면 리퀘스트 코드는 0
- 전달 받은 값은 리퀘스트 코드 0으로 구분하여 코드 작성 (조건문 이용)
- startActivityForResult와의 차이점
- 데이터와 리퀘스트 코드를 result.getData(), result.getRequestCode() 로 접근
- 정의된 ActivityResultLauncher 객체를 사용하여야 하기 때문에 객체 정의시 onCreate()보다 상단에 정의
// MainActivity Override Method Define
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 0) {
String returnData = result.getData().getStringExtra("returnData");
TextView returnText = findViewById(R.id.textReturn);
returnText.setText(returnData);
}
}
});
// MainAcivity
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivityResult.launch(intent);
다른 액티비티에서 데이터 전달하는 방법은 동일
이동된 액티비티에서 액티비티가 종료 될 때 값을 전달하는 소스 코드
- 값 전달은 단방향 데이터 전달과 같음
- 다만, setResult로 리퀘스트코드와 인텐트 객체 정보 전달
// SubActivity
Intent intent = new Intent(SubActivity.this, MainActivity.class);
intent.putExtra("dataKey", dataValue);
setResult(0, intent);
앱으로 액티비티간 데이터 전달 구현하기 (Android Studio)
기능 설계
- 메인액티비티에서 전달 할 데이터를 입력하고 버튼을 눌러 전달하면 서브액티비티에서 값을 확인
- 뒤로가기 버튼으로 서브액티비티가 종료 될 때, 서브액티비티에서 메인액티비티로 값 전달
레이아웃 UI 설계
- MainActivity
- SubActivity
소스 코드
해당 소스 코드는 startActivityForResult와 ActivityResultLauncher 가 모두 구현되어 있습니다.
기능은 같기에 startActivityForResult는 주석처리하였습니다. 상황에 따라 사용하세요.
- MainActivity.java
public class MainActivity extends AppCompatActivity {
// ActivityResultLauncher Method
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 0) {
String returnData = result.getData().getStringExtra("returnData");
TextView returnText = findViewById(R.id.textReturn);
returnText.setText(returnData);
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editSend = findViewById(R.id.editSend);
Button btn = findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String dataValue = editSend.getText().toString();
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("dataKey", dataValue);
//startActivityForResult(intent, 0);
startActivityResult.launch(intent);
}
});
}
// startActivityForResult Method
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
String returnData = data.getStringExtra("returnData");
TextView returnText = findViewById(R.id.textReturn);
returnText.setText(returnData);
}
}
}
- SubActivity.java
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
TextView txtResult = findViewById(R.id.textResult);
String resultData = getIntent().getStringExtra("dataKey");
txtResult.setText(resultData);
}
@Override
public void onBackPressed() {
Intent intent = new Intent(SubActivity.this, MainActivity.class);
intent.putExtra("returnData", "This is ReturnData");
setResult(0, intent);
super.onBackPressed();
}
}
실행 화면
- 처음 실행 화면, MainActivity
- Hello!!! 입력 후 전달 버튼을 눌러 SubActivity로 이동하여 전달받은 데이터(Hello!!!) 출력
- 뒤로가기 버튼을 눌러서 SubActivity가 종료되면 MainActivity로 값 전달하고 전달 받은 값 출력
- 전달 데이터 : "This is ReturnData"
반응형