엑티비티간 전달 방법 관련 아주 좋은 글 :
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 을 지원하는 메서드들이 존재한다. 이용하는 방법은 위와 크게 다르지 않다는 점!