안드로이드에서 Intent를 통해서 Activity로 data를 전달할 때, 

String이나 int같은 기본형이 아니고, 객체로 전달해야 할 때가 있습니다.


이때 Java에서 제공하는 Serializable을 implement하면 ,

객체를 직렬화해주고, 다시 복원할 수 있게 해주구요.


putExtra()에 인자로 넣어서 넘겨주기만 하면되니,

구현해야할 메소드도 없어, 사용하기도  편리합니다. 


참고로 아래링크에서 Serializable에 대해서 볼 수 있습니다.

(Activity로 Object넘겨줄 때엔 Serializable) 


그런데, 한가지 방법이 더 있습니다.

바로 Parcelable이라는 interface를 사용하는 것입니다.

구현하기는 좀더 복잡하기는 하지만,

Java에서 재공해주는 Serializable보다, 안드로이드에서 훨씬 빠른 속도를 보여준다고 합니다.


빠른 속도라고 하니, 꼭 사용해 봐야겠다는 생각이 드는데요.

코드를 작성해보면서, 실제 사용법을 정리해 보겠습니다.



1. 데이터 클래스 생성


먼저 Student 라는 데이터 클래스를 하나 만듭니다.

단순하게 이름과 점수, 주소, 전화번호로 된 String으로 구성하겠습니다.


(하단의 getter와 setter는 생략하였습니다.)


2. Parcelable 클래스 구현


다음으로 Parcelable을 implement해보겠습니다.

구현하라고 하는 method는 두 가지인제요. describeContents()와 writeToParcel 인데요. 우선 implement해줍니다.




그런데 두개의 메소드를 구현하고나서도, 위의 Student에 빨간선이 생기는 것을 볼 수 있는데요.

AndroidStudio가 무언가 도움을 주려는 느낌이 드시나요?

그럼 도움을 받아보겠습니다. alt + enter를 눌러보니 아래와 같은 화면이 나옵니다.

implement해야할게 더 있나보군요.



첫번째 옵션을 선택해주면, 아래와 같이 추가로 implement를 androidStudio가 더해줍니다.

핵심은 CREATOR를 생성해주는 건데요.

이 CREATOR가 Parcelable에서 필수적으로 가져야 하는, non-null static 필드입니다.


Serializable에 비교해서, Parcelable은 조금 복잡하다고 생각했는데,

AndroidStudio가 많이 도와주는군요.





위에서 생성한 Student(Parcel in)은 외부에서 클래스를 생성할 때, 사용하는 것이 아니라, CREATOR가 사용하는 생성자인데요.

외부에서 사용하는 생성자가 필요하므로 만들어 줍니다.

기본 생성자를 생성해줘도 되겠지만, set해야 하는 data들을 인자로 받아서 생성할 때, set해주도록 하겠습니다.



describeContents는 FILE_DESCRIPTOR일 경우 외에는 수정할 필요가 없구요.

writeToParcel은 이미 AndroidStudio가 작성을 해줬으므로, 아래와 같이 그대로 놔두어도 되겠습니다.





3. Service로 데이터 전송


이제 그럼 위에서 만든 Parcelable을 본격적으로 이용해보겠습니다.

이번에는 Service로 데이터를 한번 전송해보겠습니다.

(Service를 생성하는 것에 관한 것은 아래 글을 참고해주세요)

>>> Service 로 Background 에서 음악 플레이 하기 <<<


데이터를 전송하기위해서는 intent를 생성하고, putExtra에 Parcelable을 implement한 Student 객체를 넣어주고나서,

startService() 에 인자로 생성한 intent를 전달해  주면 됩니다.




4. Service에서 받기


이제 MainActivity에서 보낸 데이터를 받아서 토스트팝업을 띄어보겠습니다.

Service의 onStartCommand에서 인자로 받은, intent에 getParcelableExtra()메소드로 객체를 받아옵니다.




아래와 같이 데이터가 잘 전달된 것을 확인할 수 있습니다.




  1. 프로그래밍막내 2019.03.23 21:31 신고

    감사히 잘봤습니다!!

+ Recent posts