[안드로이드] Activity 간 클래스 객체 전달 하기



다른 설명 글 : 

http://blog.naver.com/ateon1?Redirect=Log&logNo=120167089373


엑티비티간 전달 방법 관련 아주 좋은 글 : 

http://www.forcert.com/bbs/board.php?bo_table=B49&wr_id=82643


엑티비티간 전달 방법 

---------------------------------------------------------------------

1.static 변수로 선언하는 방법도 있습니다.
 
Main1, Main2, Main3 클래스가 있는데
Main1 에 static int delay = 5000; 이라는 변수를 선언했다고 한다면
Main2 나 Main3 에서는 Main1.delay 이런식으로 갖다 쓰시면 됩니다.
 
2. SharedPreferece를 사용하는 방법도 있습니다.
이건 설명이 길어지니 따로 구글링으로 검색해보심이..
 
3. ContentProvider를 구현하는 방법도 있습니다.
이것역시 2번과 마찬가지..

4. intent 이용
----------------------------------------------------------------------

아래는 4번의 경우


원글 : http://manhdh.blog.me/120160850119


Intent 를 통해 Activity 간 데이터를 전송하고자 할때, 

일반적인 int, float, boolean, byte, String 등의 기본적인 데이터형은 직관적인 api 이름들로 인해 쉽게 주고 받을수 있다.

하지만 객체를 주고 받을려고 보면 딱히 어떤 api 를 써야하는지 감이 오지 않을것이다. (자바의 기반지식이 없다면..)

그럼 객체를 사용하려면 어떻게 해야하는가?


바로 시리얼라이즈와 Parcel 을 이용해야한다.


시리얼라이즈는 객체를 일차원의 데이터 형태로 변환하고 이를 활용하는 방법이며,

Parcel 은 원래 프로세스간 통신을 위해 만들어진 장치인데, 잘만 이용하면 엑티비티 통신을 위해 활용할수도 있다.

이 둘의 차이점이라고 하면 시리얼라이즈는 파일을 기반으로 하고, parcel 은 안드로이드 공유 메모리를 기반으로 하고 있다는 점이다.

따라서, 속도면에서 Parcel 이 빠르다고 할수있으며, 안드로이드 시스템 소스를 살펴보면 아주 많은 부분들이 이 Parcel을 이용하고있다.


※ 아래 예제는 Item 이라는 임의의 클래스를 상기 2가지 인터페이스를 상속받아 이용하였다.


1. Serializable 인터페이스를 이용한 시리얼라이즈 방법

- Serializable  인터페이스만 상속 받으면 끝 간단하다.

public class Item implements Serializable {
  private static final long serialVersionUID = 1L//시리얼라이즈 시 사용되는 버전명으로서 안쓰면 경고 뜸
  public int number1;
  public int number2;
  public String str;
  
  public Item(int num1, int num2, String s) {
    number1 = num1;
    number2 = num2;
    str = s;
  } 
}



2. Parcelable 인터페이스를 이용한 마샬링 방법

- CREATOR 생성과 4개의 메서드를 오버라이딩 해야한다.

public class Item implements Parcelable {
  public int number1;
  public int number2;
  public String str;
  
  public Item(int num1, int num2, String s) {
    number1 = num1;
    number2 = num2;
    str = s;
  }

  @Override
  public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
  }

  // 데이터를 쓰는 메서드이며, 어떤 데이터를 차례대로 write 하는 유심히 봐둘 필요가 있다.
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(number1);  
    dest.writeInt(number2);
    dest.writeString(str);
  }
  
  public static final Parcelable.Creator<Item> CREATOR = new Creator<Item>(){ // 인스턴스 이름 CREATOR 고정

    // 데이터를 불러오는 메서드

    // 주의 할점은 데이터를 read 할때 어떠한 구분자를 사용하지도 않는다.

    // 이는 writeToParcel 메서드를 통해 write 했던 순서대로 불러오기 때문인데..

    // 따라서, 반드시 동일한 변수의 순서대로 데이터를 read 해야한다는 점 명심하자.

    @Override
    public Item createFromParcel(Parcel source) {
      int number1 = source.readInt();
      int number2 = source.readInt();
      String str = source.readString();
      return new Item(number1, number2, str);
    }

    @Override
    public Item[] newArray(int size) {
      return new Item[size];
    }
    
  };
}




3. 객체 저장 및 불러오기

 // 객체 저장 시 

 Intent intent = new Intent();
 Item item = new Item(10,20,"hello");
 intent.putExtra("key", item);


============================================== 


 // 시리얼라이즈 일 때, 객체 로드 방법     
 Item item = (item)intent.getExtras().getSerializable("key");


 // Parcel 일 때,

 Item item = (item)intent.getExtras().getParcelable("key");


※ 여기서는 단순한 단일 객체만을 이용했는데 Intent 의 메서드를 살펴보면 array 기반의 시리얼라이즈, parcel 을 지원하는 메서드들이 존재한다. 이용하는 방법은 위와 크게 다르지 않다는 점!