본문 바로가기
Android

Android 단방향 데이터 전달, 양방향 데이터 전달

by leopard4 2023. 1. 30.

<단방향데이터전달 부분

단방향 데이터 전달

(second 코드를 먼저보여줌)

나이에 + 10을 해서 보여줌

 

 

Main 화면

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

        String strName = editName.getText().toString().trim();
        String strAge = editAge.getText().toString().trim();
        int age = Integer.parseInt(strAge);


        // SecondActivity로 화면 전환

        // 인텐트를 만든다!
        // 인텐트란, 어떤 액티비티가, 어떤 액티비티를 띄우겠다 라는것
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        // 새로운 액티비티에 전달할 데이터를 셋팅한다.
        // key, value 로 데이터 셋팅!
        intent.putExtra("name", strName);
        intent.putExtra("age", age);

        startActivity(intent);
    }

 

Second 화면

// 이 액티비티를 실행한 액티비티로부터 데이터를 받아오는 코드
// 인텐트를 가져오고, 그 인텐트에 들어있는 키값으로 데이터를 받아온다.
String name = getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age", 0 );


// getXXXExtra() 함수
// XXX 부분에는 데이터의 타입을 적어주면 된다.
// String, int, boolean, float, double, long

txtName.setText(name);

age = age + 10;
txtAge.setText(age+"");

단방향데이터전달 끝>

 

 

<양방향 데이터 전달

세컨드 액티비티에서 보낸 데이터를 메인화면에서 수신하는 것

바뀐부분은 마우스로 드래그 하였으니 그부분만 확인.

 

 

main 화면 코드전체 

package com.leopard4.lifecycle;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button button;
    EditText editName;
    EditText editAge;
    TextView txtAge;

    // 내가 실행한 액티비티로부터, 데이터를 다시 받아오는 경우에 작성하는 코드
    ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == 0) {
                        int age10 = result.getData().getIntExtra("age10", 0);
                        txtAge.setText(age10 + "");

                    }
                }
            });


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

        Log.i("LifeCycleApp", "onCreate 함수 실행");

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

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

                String strName = editName.getText().toString().trim();
                String strAge = editAge.getText().toString().trim();
                int age = Integer.parseInt(strAge);

                // SecondActivity로 화면 전환

                // 인텐트를 만든다!
                // 인텐트란, 어떤 액티비티가, 어떤 액티비티를 띄우겠다 라는것
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                // 새로운 액티비티에 전달할 데이터를 셋팅한다.
                // key, value 로 데이터 셋팅!
                intent.putExtra("name", strName);
                intent.putExtra("age", age);

                // 아래 startActivity 함수는 단방향 데이터 전달할때만 사용
                //startActivity(intent);

                // 양방향 데이터 전달할때는
                launcher.launch(intent);
            }
        });

    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.i("LifeCycleApp", "onStart 함수 실행");
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i("LifeCycleApp", "onResume 함수 실행");
    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.i("LifeCycleApp", "onPause 함수 실행");
    }

    @Override
    protected void onStop() {
        super.onStop();

        Log.i("LifeCycleApp", "onStop 함수 실행");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Log.i("LifeCycleApp", "onDestroy 함수 실행");

    }
}

second 화면 코드전체 

package com.leopard4.lifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import org.w3c.dom.Text;

public class SecondActivity extends AppCompatActivity {

    TextView txtName;
    TextView txtAge;
    int age;

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

        Log.i("LifeCycleApp", "SecondActivity onCreate 함수 실행");

        txtName = findViewById(R.id.txtName);
        txtAge = findViewById(R.id.txtAge);

        // 이 액티비티를 실행한 액티비티로부터 데이터를 받아오는 코드
        // 인텐트를 가져오고, 그 인텐트에 들어있는 키값으로 데이터를 받아온다.
        String name = getIntent().getStringExtra("name");
        age = getIntent().getIntExtra("age", 0 );


        // getXXXExtra() 함수
        // XXX 부분에는 데이터의 타입을 적어주면 된다.
        // String, int, boolean, float, double, long

        txtName.setText(name);

        age = age + 10;
        txtAge.setText(age+"");

    }


    // Back 버튼 눌렀을때의 이벤트 처리 방법
    @Override
    public void onBackPressed() {

        Log.i("LifeCycleApp", "SecondActivity onBackPressed 함수 실행");

        // 10년후의 나이를 메인 액티비티로 전달!!!
        Intent intent = new Intent();
        intent.putExtra("age10", age);
        // 돌려줄때는 startActivity 가 아니라, setResult 함수 이용
        setResult(0, intent);

        super.onBackPressed();
    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.i("LifeCycleApp", "SecondActivity onStart 함수 실행");
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i("LifeCycleApp", "SecondActivity onResume 함수 실행");
    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.i("LifeCycleApp", "SecondActivity onPause 함수 실행");
    }

    @Override
    protected void onStop() {
        super.onStop();

        Log.i("LifeCycleApp", "SecondActivity onStop 함수 실행");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Log.i("LifeCycleApp", "SecondActivity onDestroy 함수 실행");
    }
}