본문 바로가기
Android

[Android] 안드로이드 : 부가데이터

by 꿈나무 김땡땡 2019. 12. 9.

1. 부가데이터란?

추가 정보를 전달하고 싶을 때 인텐트 안에 데이터를 넣어서 전달할 때의 데이터를 의미

 

put으로 넣고 get으로 뺀다.

 

  • 전달 할 부가 데이터의 양이 너무 많을때는? Parcelable 이용 : Bundle(객체)을 전달

 

 

2. 플래그란?

인텐트에 일종의 옵션 정보를 넣어주는 것

플래그가 있으면 특정 이벤트를 특정 방법으로 처리

 

3. 액티비티 스택

  •  스택 : 후입선출
    cf) 큐 : 선입선출

FLAG_ACTIVITY_SINGLE_TOP (플래그 예시) : 2번째 액티비티 있으면, 그 위에 또 쌓는 것이 아니라 액티비티#2를 재사용

 

4. 액티비티에서 인텐트를 전달 받는 두가지 경우

  • onCreate : 콜백 함수
  • 액티비티 재사용 하는 경우에는 onCreate 메소드 호출 X  > onNewIntent 라는 메소드를 호출

 

5. 예제 코드

  • MainActivity에서 "메뉴화면 띄우기" 누르면 MenuActivity가 나온다.
  • MenuActivity에서 "돌아가기" 누르면 MainActivity로 돌아가고 + 전달 받은 데이터 개수를 토스트 메시지로 알려준다.

* Serializable 사용하는 경우

(1) app > new > activity > MenuActivity 생성

(2) MainActivity.java

public class MainActivity extends AppCompatActivity {

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

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);

                ArrayList<String> names = new ArrayList<String>();
                names.add("김철수");
                names.add("김펭수");

                // 인텐트 안에 부가 데이터 넣기
                intent.putExtra("names", names);

                // 응답을 받고 싶을 경우
                startActivityForResult(intent, 101);
            }
        });
    }

 

(3) MenuActivity.java

public class MenuActivity extends AppCompatActivity {

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

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 메인 화면으로 돌아가기
                finish();
            }
        });

        Intent passedIntent = getIntent();
        processIntent(passedIntent);
    }

    private void processIntent(Intent intent) {
        if (intent != null) {
            ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");
            if (names != null) {
                Toast.makeText(getApplicationContext(), "전달 받은 이름 리스트 개수 : " + names.size(), Toast.LENGTH_LONG).show();
            }
        }
    }
}

 

* Parceable 사용하는 경우

(1) java > class > SimpleData (Kind : class, Interface : Parcelable) 생성

(2) MainActivity.java

public class MainActivity extends AppCompatActivity {

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

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);

                // Parcel로 만든 데이터를 받음
                SimpleData data = new SimpleData(100, "Hello");
                intent.putExtra("data", data);

                // 응답을 받고 싶을 경우
                startActivityForResult(intent, 101);
            }
        });
    }
}

 

(3) MenuActivity.java

public class MenuActivity extends AppCompatActivity {

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

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 메인 화면으로 돌아가기
                finish();
            }
        });

        Intent passedIntent = getIntent();
        processIntent(passedIntent);
    }

    private void processIntent(Intent intent) {
            SimpleData data = (SimpleData) intent.getParcelableExtra("data");
            if (data != null) {
                Toast.makeText(getApplicationContext(), "전달 받은 SimpleData : " + data.message, Toast.LENGTH_LONG).show();
            }
        }
    }
}

 

(4) SimpleData.java

public class SimpleData implements Parcelable {

    int number;
    String message;

    // Generate > Constructor
    public SimpleData(int number, String message) {
        this.number = number;
        this.message = message;
    }

    // Parcel : 데이터를 다른 곳에 전달할 때 사용하는 객체
    public SimpleData(Parcel src) {
        number = src.readInt();
        message = src.readString();

    }

    // Generate > Implement Methods
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(number);
        dest.writeString(message);

    }

    // CREATOR Field 정의
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public SimpleData createFromParcel(Parcel src) {
            return new SimpleData(src);
        }

        public SimpleData[] newArray(int size) {
            return new SimpleData[size];
        }

    };
}

댓글