Android(Java) - Activity - 액티비티 간 데이터 전달 (단방향/양방향)

반응형

 

이번 포스팅에서 설명하고 시현한 앱은 깃허브에서 다운로드 가능합니다.

https://github.com/luvris2/Android-MultiActivityDataTest-App

 

GitHub - luvris2/Android-MultiActivityDataTest-App

Contribute to luvris2/Android-MultiActivityDataTest-App development by creating an account on GitHub.

github.com


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

다른 액티비티에게 데이터 전달하는 소스 코드

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"

반응형