Development/Android

19. Parcelable

궁선이 2018. 5. 5. 01:44

Intent를 통해 객체를 넘겨받고 싶을때가 있을 것 입니다.
예를 들면 어떤 사람의 인적사항, 물건의 정보 등을 액티비티간에 주고받고 싶다면
Intent를 사용해야 겠다고 생각은 할 것이나, 실제로는 주고 받아지지 않을 것 입니다.

객체를 주고 받기위해서는 바로 객체 클래스에 Parcelable을 상속받아 사용해야 합니다.
Intent의 사용법은 앞 포스팅 7.Intent에 설명되어 있습니다.

간단하니 바로 시작하겠습니다.

1.객체 클래스

제가 이전에 다른 앱을 위해 작성하였던 코드이지만
단순히 메서드만 보면 이해가 힘드시기에 코드를 통째로 붙였습니다.

Parcelable 인터페이스를 상속받아 추상메서드를 모두 구현하여 줍니다.
또한 오버라이딩을 하여 아래와 같이 구현하여 줍니다.
한가지 팁이자면 변수를 모두 선언한 후 Parcelable을 상속받는 것이 구현이 훨씬 편리합니다.
왜냐하면 메서드가 생성될 때 자동으로 코드를 작성하여 줍니다.

public class Data implements Parcelable{ private String name; private String call; private String[] menu; private String homepage; private String registered; private String category; public Data(String name, String call,String[] menu, String homepage,String registered,String category){ this.name = name; this.call = call; this.menu = menu; this.homepage = homepage; this.registered = registered; this.category = category; } public void setData(String name, String call,String[] menu, String homepage,String registered,String category){ this.name = name; this.call = call; this.menu = menu; this.homepage = homepage; this.registered = registered; this.category = category; } //추상메서드 구현 protected Data(Parcel in) { name = in.readString(); call = in.readString(); menu = in.createStringArray(); homepage = in.readString(); registered = in.readString(); category = in.readString(); } //추상메서드 구현 public static final Creator<Data> CREATOR = new Creator<Data>() { @Override public Data createFromParcel(Parcel in) { return new Data(in); } @Override public Data[] newArray(int size) { return new Data[size]; } }; //오버라이딩 @Override public int describeContents() { return 0; } //오버라이딩 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(call); dest.writeStringArray(menu); dest.writeString(homepage); dest.writeString(registered); dest.writeString(category); } }

2. 주고받기

주거니

public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); } public void onClick(View v){ Intent intent = getIntent(); Data temp; temp = new Data(); //생성자로 데이터 생성 intent.putExtra("data",temp); if(v.getId() == R.id.btnCancel){ setResult(RESULT_CANCELED,intent); }else{ setResult(RESULT_OK,intent); } }

받거니

public class MainActivity extends AppCompatActivity { Data data_container; final int _ADD_QUERY = 100; final int _CALL_QUERY = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v){ Intent intent = new Intent(this,Main2Activity.class); intent.putExtra("data",data_container); startActivityForResult(intent,_ADD_QUERY); } //받거니 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == _ADD_QUERY){ if(resultCode == RESULT_OK){ data_container = data.getParcelableExtra("data"); } }else{ if(resultCode == RESULT_OK){ } } super.onActivityResult(requestCode, resultCode, data); }

다른 데이터 타입과 다른 점은 크게 없습니다.

감사합니다.