[Intent #2] Activity간 정보 전달 [Parcelable]

Posted by [하늘이]
2010. 12. 1. 23:24 IT/Android[안드로이드]
반응형

Activity간에 정보를 전송할때 객체를 전달해야되는 경우에 사용된다.

전달시키는 객체가 PlayerRepeatABInfo이라면...아래와 같다.
1. 우선 전달할 객체에 Parcelable을 implements한다.
 
public class PlayerRepeatABInfo implements Parcelable{

2. 이렇게 하면, 기본 두개를 override해야된다.
public int describeContents()
public void writeToParcel(Parcel out, int arg1) 

3. Parcelable.Creator를 추가해야된다. => 안하는 경우, CREATOR를 참조하면서 exception이 나오게 됩니다.
public static final Parcelable.Creator CREATOR

4. Parcel 인자가 있는 생성자를 추가해야된다.
public PlayerRepeatABInfo(Parcel in) {

Activity에서 데이타 전달시키기
1. Intent 생성
Intent intent = new Intent(PlayerActivity.this, RepeatMenu1Th.class);
2. 객체 매핑
intent.putExtra("CurrentMusicRepeatInfo", mSetRepeatInfo);
3. Start Activity.
startActivityForResult(intent, GO_REPEAT_MENU);


전달 받는 Activity에서 하는 내용.
1. 전달된 내용을 가져올 bundle를 구성.
Bundle temp = getIntent().getExtras();

2. 전달된 String으로 객체 가져오기.
PlayerRepeatABInfo mInfoData = temp.getParcelable("CurrentMusicRepeatInfo");

장황하게 글로 보는 것 보다 소스를 한번 보면 쉽게 사용하실수 있을 것입니다.
==========================================================================================================
 
PlayerRepeatABInfo.java

public class PlayerRepeatABInfo implements Parcelable{
 private long mTotalTime;
 private long mStartPosition;
 private long mEndPosition;
 private String mFilePath;
 private byte mIsSetRepeatInfo;
........ 
 public PlayerRepeatABInfo(Parcel in) {
  mTotalTime = in.readLong();
  mStartPosition = in.readLong();
  mEndPosition = in.readLong();
  mFilePath = in.readString();
  mIsSetRepeatInfo = in.readByte();
 }
...... 
 @Override
 public int describeContents() {
  // TODO Auto-generated method stub
  return 0;
 }
 @Override
 public void writeToParcel(Parcel out, int arg1) {
  out.writeLong(mTotalTime);
  out.writeLong(mStartPosition);
  out.writeLong(mEndPosition);
  out.writeString(mFilePath);
  out.writeByte(mIsSetRepeatInfo);
 }
  public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
  public PlayerRepeatABInfo createFromParcel(Parcel in) {
   return new PlayerRepeatABInfo(in);
  }
  public PlayerRepeatABInfo[] newArray(int size) {
   return new PlayerRepeatABInfo[size];
  }
 };
...... 
}
==========================================================================================================
이동 했던 Activity 에서 이전 Activity로 복귀시 Class 내용
PlayerActivity.java
private PlayerRepeatABInfo mSetRepeatInfo = new PlayerRepeatABInfo(xxxxx);
........

public void onClick(View v) {
........
   Intent intent = new Intent(PlayerActivity.this, RepeatMenu1Th.class);
   intent.putExtra("STRING_TAG", mSetRepeatInfo);   => 이 녀석은 전달하려는 객체입니다.
            startActivityForResult(intent, GO_REPEAT_MENU);
  }
 };
==========================================================================================================
전달 받은 객체 꺼내는 Class 내용

public class RepeatMenu1Th extends ListActivity {
........
 protected void onCreate(Bundle savedInstanceState) {
........
  Bundle temp = getIntent().getExtras();
  PlayerRepeatABInfo mInfoData = temp.getParcelable("STRING_TAG");
........
}
}





반응형