코드네임 :

📱 모바일프로그래밍 - 양방향 데이터 전달하기 📱 본문

백엔드/Android_JAVA

📱 모바일프로그래밍 - 양방향 데이터 전달하기 📱

비엔 Vien 2024. 11. 12. 16:47

New 로 subActivity 생성

 

startActivity(intent)는 단방향 데이터이다

 

양방향으로는 못하나?? = 있음!

ActivityResultlaucher를 사용한다!

 

 

코드는 Example 6_1_2코드들 (주석달린거)

public class MainActivity extends AppCompatActivity {

    //launcher는 ActivityResultLauncher라는 타입의 변수입니다.
    //이 변수는 액티비티를 호출하고 결과를 받아오는 데 사용하는 도구
    ActivityResultLauncher<Intent> launcer;
    
    
    ~onCreate(){


        btnNewActivity.setOnClickListener(new View.OnClickListener() { //익명객체 new ~
            @Override
            public void onClick(View view) {
                
                //Intent 생성:
                //Intent는 MainActivity에서 SubActivity로 화면을 전환하기 위한 객체입니다.
                //MainActivity.this는 현재 컨텍스트, SubActivity.class는 대상 액티비티입니다.
                Intent intent = new Intent(MainActivity.this, SubActivity.class); //MainActivity에서 SubActivity로 넘어갈껍니다
                intent.putExtra("name", editText.getText().toString()); //가져온 에딧텍스트의 텍스트 타입을 스트링 타입으로
                intent.putExtra("age", Integer.valueOf(editText2.getText().toString()));
                
                //startActivity(intent); : 단방향
                launcher.launch(intent); // 양방향

            }
        });
        
        
        
                
        //**registerForActivityResult(...)**는:
        //새로운 런처 객체를 만듭니다.
        //이 런처 객체는 다음을 기억합니다:
        //어떤 액티비티를 실행할지
        //결과를 어떻게 처리할지
        //만들어진 런처 객체를 **반환(돌려줌)**합니다.
        
        //launcher =:
        //만들어진 런처 객체를 launcher 변수에 저장합니다.
        //이렇게 저장해두면, 나중에 launcher.launch(intent) 같은 방식으로 런처를 사용할 수 있습니다.


        //= (대입 연산자): registerForActivityResult 메서드의 반환값을 launcher 변수에 저장하라는 뜻입니다.
        //registerForActivityResult : 다른 액티비티를 실행하고, 그 결과를 처리할 때 사용되는 메서드
        //ActivityResultContracts.StartActivityForResult(): 호출된 액티비티가 종료될 때 결과 코드와 데이터가 반환됩니다.
        //ActivityResultCallback: 이 콜백 함수는 다른 액티비티가 종료될 때 호출
        launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult o) {
                if(o.getResultCode() == RESULT_OK) { // o.getResultCode()로 결과 코드를 확인하고, RESULT_OK인 경우에만 이후 작업을 수행하도록
                    Intent data = o.getData(); // o.getData() :Sub 액티비티에서 전달된 인텐트(Intent) 객체를 가져옴
                    String result = data.getStringExtra("result"); //getStringExtra("result")를 사용해 **“result”**라는 키에 저장된 문자열 데이터를 가져옴
                    Toast.makeText(MainActivity.this, "결과 : " + result, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

 

 

SubActivity.

//onCreate() 내부

        Button btnReturn = findViewById(R.id.btnReturn); //파인드뷰바이아이디로 아이디 연결하는거
        TextView textView = findViewById(R.id.textView);
        TextView textView2 = findViewById(R.id.textView2);

        Intent intent2 = getIntent();
        
        String strName = intent2.getStringExtra("name");
        textView.setText(strName);

        int num = intent2.getIntExtra("age", 0);
        textView2.setText(String.valueOf(num));
        
        
        
        

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

                // 1. 인텐트를 생성
                Intent outIntent = new Intent(getApplicationContext(), MainActivity.class);
                                            //Intent 객체를 생성하여 현재 액티비티의 데이터를 MainActivity에 전달할 준비
                                            // getApplicationContext()는 현재 애플리케이션의 전체 컨텍스트를 가져오는 메서드

                // 2. 데이터 전달 설정
                outIntent.putExtra("result", strName); //	putExtra 메서드를 사용해 “result”라는 키에 strName 값을 담음
                                                            // strName은 전달하려는 실제 데이터(값)입니다.
                                                            //이로써 MainActivity는 "result"라는 이름표로 데이터를 받을 수 있습니다.

                // 3. 결과 설정
                setResult(RESULT_OK, outIntent); // setResult 메서드를 사용해 결과 코드와 데이터를 설정,
                                                 // RESULT_OK는 정상적으로 처리되었음을 의미하는 결과 코드
                                                 //  outIntent 인텐트에 담긴 데이터가 호출한 액티비티로 전달됨
                // 4. 액티비티 종료
                finish(); //액티비티 종료

            }
        });