본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-03 안드로이드 스튜디오 (intent)

반응형

액티비티 실행과 인텐트(Intent)

 

어플리케이션을 제작하게 되면 한 엑티비티(보여지는화면)만 사용하는 것이 아니라 여러 화면을 사용하게 된다 

예를 어떤 어플을 들어갓을떄 메뉴에 나와있는 버튼이나 각종 뷰를 눌럿을때 화면이 바뀌는데 그 모든것들이 하나의 액티비티 화면인거다~!! 

 

화면의 전환

위처럼 화면과 화면의 이동과 자료를 넘겨주거나 받아올수 있도록 도와주는게 Intent이다 

 

작업을 하다보면 하나의 패키지로 만들수도 있지만 반대로 다른패키지에서 작업을 해서 연결해줄때도 있을텐데

사용법이 다르니 코드표를 보면서 참고하면 되겠다 

 

먼저 같은 패키지내에서 이동및 값전달하고 전달받는 방법

package com.example.chap07;

public class MainActivity extends AppCompatActivity {
    static final int NEWACTIVITY = 1000; 
    static final int PLAYACTIVITY = 2000;

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

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);
        Button button3 = findViewById(R.id.button3);
        button.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), NewActivity.class); // 이 주소로 정보를 전달해주겠다
                //1 택배상자를 만들어서 주소를 적었다
                intent.putExtra("activity", "이거MainActivity야"); // 앞은 키값과 값이다.
                //2 만든 택배상자에 보낼 물건들을 담아주었다
                // startActivity(intent); ← 일렇게 할때는 단방향으로 데이터를 전달할때 하는 것
                startActivityForResult(intent, NEWACTIVITY); // 양방향으로 전달하고 전달받을때 사용하는 것

            }
        });
        

일단 첫번째 어플리케이션을 실행하면 제일먼저 나오는 화면이 메인 액티비티이다 

메인 액티비티에서 NewActivity로 값 전달을 해줄려고 한다 

1. 일단 인텐트를 생성해주고 내가 값을 보내줄 곳을 설정해준다

Intent intent = new Intent(getApplicationContext(), NewActivity.class);

( 택배상자를 만들고 택배상자에 보낼곳의 주소(NewActivity.class)를 적는다 생각하자) 

 

2.만든 intent.putExtra(키값 , 보낼정보 )로 담아준다

(자 상자를 만들었으면 뭘해야 할까? 내용물을 담아야 겠지? 내용물을 담을 때는 putExtra( 키 , 값) 을 활용한다 )

키값은 내가 만들고 싶은대로 만들어도 무관하다 

 

3. 정보를 담은 intent 보내주기 (단방향 , 양방향 ) 

startActivity(intent) (단반향) : 내가 데이터를 보내기만 할떄 사용

startActivityForResult(intent, 답받을곳의 값); (양방향) : 데이터를 보내고 받을 때 사용 

자 여기서 보면 양방향은 하나의 코드가 더 작성된걸 볼 수있는데 나중에 정보를 받아올때 그 정보가 어디서 온것인지 확일할 정보를 입력해주어야 한다 

보통 정수값으로 정보를 전달하고 받고 하는데 정수값으로만 그 정수값이 어디서 온것인지 확인하기 어렵기때문에  static final intNEWACTIVITY=1000;  <- 이렇게 이름을 달아 상수로 만들어서 사용을 한다  

 

package com.example.chap07;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class NewActivity extends AppCompatActivity {
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);

        Button button = findViewById(R.id.button);

        //3 보내준 택배를 받을수 있어야 한다
        intent = getIntent();

        //4 택배를 뜯어 볼려면 보낼때 적었던 키값을 알아야 한다
        //아까 보낸 택배의 값이 무슨 형태인지 보고 그 형태의 맞게 getStringExtra 혹은 getintExtra 등등으로 해서 받아줘야한다
        String name = intent.getStringExtra("activity");
        Toast.makeText(getApplicationContext(),"보낸 액티비티명 :" + name ,Toast.LENGTH_LONG).show();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent = new Intent();
                int sum=0;
                for(int i=1;i<100;i++){
                    sum+=i;
                }

                intent.putExtra("name", "NewActivity"); // 보낼 키값과 값
                intent.putExtra("sum", sum); // 키값과 값
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}

4. 택배 받기 intent = getIntent();

인텐트자료형을 만들고 intent = getIntent();이렇게 intent안에 전달받은 데이터를 받아준다 . 

 

5.받은 택배엔 뭐가 들어 있을까? intent.getStringExtra("activity")

받은 택배를 뜯어보는 방법이다. 뜯기 위해서는 보내줬던 키값을 알아야 뜯어볼수가 있다. 

위 코드에서도 처음 보낼때 내가 설정한 키값을 통해서 name에 내용물을 담아주고 토스트 메시지로 받은 값을 보여줬다 

 

6. 오는게 있으면 가는것도 있어야 겠지? 이젠 내가 택배 보내기  setResult(RESULT_OK,intent);

보낼을때 처럼 택배상자를 만들고 내가 보내줄 데이터를 담고 setResult(RESULT_OK,intent); 로 데이터 다시 보내기 

RESULT_OK 는 단순히 내가 잘 받았는지 확인 하기 위한 답변일 뿐이다. 

상호간의 답변이 잘 전달된건지 확인 하기 위하여 사용하는 것이다. 

 그리고 이화면은 끝낫다는 의미로 finish();하여 종료해준다 . 

 

@Override // 다른액티비티에서 결과값을 받아오는 메소드
    //requestCode : requestCode를 보낸 곳이 어딘지 알기위하여
    //resultCode :  resultCode가 어떤것인지
    // @Nullable Intent data : 전달받은 실제 intent 값이 들어있는 것
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == NEWACTIVITY && resultCode == RESULT_OK) {
            String name = data.getStringExtra("name"); // 보낸 값의키값으로 참조하여 그 내용을 name에 저장
            int result = data.getIntExtra("sum", 0); // 정수를 보냇을 때 초기화 해야하는데 0으로 초기화 한것
            Toast.makeText(getApplicationContext(), "응답받은 엑티비티 " + name + "," + result, Toast.LENGTH_LONG).show();
        }else if (requestCode == PLAYACTIVITY && resultCode == RESULT_OK) {
                String name1 = data.getStringExtra("name");
                String game = data.getStringExtra("game");
                Toast.makeText(getApplicationContext(), "응답받은 엑티비티 " + name1 + "," + game, Toast.LENGTH_LONG).show();
            }

        }

    }

7. 자자 거의다 끝나가 다시보낸 데이터 열어보기~! onActivityResult(메소드) 

다시 메인액티비티로 왔고 다른액티비티에서 데이터를 받아오는 메소드를 사용해야한다.

사용하지 않으면 데이터를 받을수가 없다 

오른쪽마우스 누른뒤 generate - override Methods - onActivityResult 검색후 사용 

 

이렇게 하여 같은 클래스에서 데이터를 주고 받았다 그럼 다른 패키지에서는 어떻게 하는지 보자! 

 

  //다른 패키지와의 연결
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();                   // 받을놈의 패키지            
                ComponentName componentName = new ComponentName("com.example.another" ,
                        //받을놈의 패키지와 클래스
                        "com.example.another.MainActivity");
                intent.setComponent(componentName);
                intent.putExtra("name" , "Chap07_MainActivity");
                startActivity(intent);
            }
        });

1.  택배상자 만들고 ComponentName componentName = new ComponentName() 이걸로 보내줌

앞쪽은 받을 곳의 패키지 주소를 적어주고 , 뒤쪽엔 받을 곳의 패키지.클래스명을 적어준다.

그리고난뒤 intent.setComponent(componentName); 이렇게 주소를 적어주고 보내주면 된다! 나머지는 다 같음 !! 

 

 

그럼 이론적으로 어떻게 흘러가는지 글솜씨가 없어서 못쓰고 그림이로 이해하자 

전체 적인 흐름 

패키지 매니저는 앱이 만들어지면 매니패스트에서 정보를 수집 갖고 있는다 

고로 A에서 인텐트로 택배를 보내면 액티비티매니저는 패키지매니저에게 이거 위치를 물어보고 패키지매니저는 위치를 알려주고 다시 주소를 알게된 액티비티 매니저는 그 주소로 인텐트를 보내게 되는것이다 .

 

고로 인텐트는 데이터를 담고 있는 덩어리다!!  

 

(21/3/10 복습 1번) 

반응형