액티비티에서 액티비티에서 또는 프래그먼트로, 여러 경로로의 데이터 전달 시에 안드로이드에서는 주로

Intent라는 객체를 이용하게 됩니다.

이 객체에 할 일을 담을 수도 있고, 어떠한 데이터를 담아서 다른 액티비티에게 전달해 줄 수 있죠.

그런데 Intent에 객체나 클래스, 자주 사용하는 ArrayList와 같은 것을 담기엔 무리가 있어 보이네요.

 

그래서 사용하는게 Parcelable이라는 객체입니다.

이 객체에는 객체를 담을 수 있습니다.

예를 들어, 어떤 데이터를 주고 받을 때, 여러분들은 데이터만을 담은 클래스를 자주 활용할 것입니다. 대표적으로 ListView를 활용할 때죠.


parcel을 이용한 데이터 클래스 만들기

먼저 여러분이 활용할 데이터 클래스를 만들어 보겠습니다.

먼저 우리는 parcel을 이용할 것이니 implements부터 해줍니다. 그러면 자동으로

1. describeContents() 와 writeToParcel을 Override시켜 줄 것입니다. 근데 비어있네요? 이것도 별도의 control이 필요하지 않은 이상 일단 그대로 둡니다.

describeContents() - Parcel 하려는 오브젝트의 종류를 정의한다. 

writeToParcel(Parcel dest, int flags) - 실제 오브젝트 serialization/flattening을 하는 메소드. 오브젝트의 각 엘리먼트를 각각 parcel해줘야 한다.

2. 다음으로는 여러분의 데이터를 만들면 됩니다. 제가 만든 예제에서는 간단하게 학생이름과 학번을 사용했습니다.

3. 이렇게 생성자를 만들고 나면, 사실 이 전에 class name에 빨간 밑줄이 그어져 있는 것을 확인 할 수 있는데, 이 부분에 마우스를 가져다놓으면 add하라는 명령어 하나가 보일 것입니다. 그걸 그대로 클릭해주면! 위의 형식이 완성됩니다.

Parcel에서 데이터를 un-marshal/de-serialize하는 단계를 추가해줘야 한다. 그러기 위해서 Parcelable.Creator 타입의 CREATOR라는 변수를 정의해야 한다. 이 변수를 정의하지 않으면 안드로이드는 다음과 같은 익셉션을 발생한다.

Parcelable protocol requires a Parcelable.Creator object called CREATOR

4. 물론, 비어있던 writeToParcel도 채워진게 보이죠? 

5. 자, 그러면 이제 클래스 데이터를 옮길 준비가 되었습니다.

 

순서대로 하면 parcel에 data를 쓰고, 즉 flatten해주고 이것들을 담은 parcel을 가져와 생성자를 이용해 객체를 만들어주게 됩니다.


데이터 옮겨서 확인하기

자 그럼 이제 데이터가 잘 옮겨지는지 확인 해봅시다.

예제는 상당히 간단하니, 코드만 보여드리고 MainActivity의 레이아웃에는 버튼 하나만 추가된 상태입니다!(쉽게 따라할 수 있게 하기 위해서)

이제 putParcelableArrayListExtra를 사용할 수 있습니다.

putExtra에도 배열을 보낼 수 있습니다. (putExtra의 한계는 어디까지인지? 확인안해봄.여기서 중요한건 아니니)

설명이 따로 필요가 없습니다. 바로 결과를 확인해보죠

결과 액티비티는 이렇게 만들었구요. 레이아웃을 사용하지 않기 위해서 로그창으로 띄웠습니다.

추가로 객체만 보냈을 때의 주석을 보시면, 저런 식으로 받을 수 있습니다. 참고!

 

결과

 

 

Reference

http://aroundck.tistory.com/57

'# 기타 공부한 것들 > Android' 카테고리의 다른 글

안드로이드 toolbar 만들기  (0) 2018.08.16
안드로이드 Tab 만들기  (0) 2018.08.15
Volley 사용하기(GET, POST)  (0) 2018.08.06
Nevigation View 만들기  (0) 2018.07.26
Toobar, appbar 경계선 없애기  (0) 2018.07.25