'액티비티 값 전달'에 해당되는 글 1건

  1. 2009.09.30 Parcelable Interface를 이용한 Activity 간에 데이터 전송

Parcelable Interface를 이용한 Activity 간에 데이터 전송

|

개요. 

사용자가 작성한 클래스의 객체를 액티비티 사이에 자료 전송을 위하여 Parcelable 인터페이스를 사용한 방법IntentTest 액티비티의 EditText의 글의 내용을 SubActivity에 있는 TextView에 찍어내는 예제

레이아웃

메인 액티비티

SubActivity

얼핏 보기에는 아무런 별 문제가 없어 보인다. 임의로 id값에 숫자 110을 주었고 새로 생성할 액티비티의 패키지 이름과 클래스 이름을 주어서 인텐트 객체를 생성시키고 데이터 저장 형태인 Data객체를 생성해서 putExtra메소드를 이용해 데이터를 전송하고, SubActivity에서는 getExtra해서 얻은 Data객체에서 id:message를 TextView에 출력하는 것 처럼 보인다. 하지만 다음과 같은 화면이 기다린다.

putExtra에서 Data라는 근본모를 객체를 처리할 수가 없다면서 에러를 뱉어낸다. 왠지 건방지지만 어찌 건드릴 수 없는 포스를 뿜어낸다. 그러면 어떻게 해야 할까?? 원격 객체 제어하면서 보았던 Serialize를 떠올리거나 아니면 C에서 처럼 메모리 크기만 정해주고 그 크기만큼 입/출력 포인터에다가 냅다 써갈기는 방법들 말이다.

안드로이드에서 액티비티간의 데이터 전송 중 int, byte 같은 primitive 자료형 들은 별도의 작업없이 전송을 할 수 있지만 이 예제에서 처럼 사용자에 의해 정의된 객체를 전송할때에는 약간의 테크닉이 필요하다. 

Parcel Class 혹은 Parcelable Interface를 이용한 방법이 되겠다. 우선 가장 큰 도움이 되었던 예제는 다름아닌 Android References페이지에 있는 Parcelable Interface 항목이었다. 사용자 정의 클래스는 Parcelable 인터페이스를 구현(implements)시켜서 한번 정의해두면 각 액티비티에서는 별도의 작업없이 편하게(마치 원시 자료형 전송하듯) 전송할 수 있는 것이 장점인데. 여기서는 그렇게 하려고 한다. (그러지 않으면 전송 보내고 받을 때마다 Parcel객체를 생성해서 실어서 보내고 또 받는 쪽에서도 Parcel에서 다시 Data객체를 뽑아내는 작업을 해야 한다.) 

어쨌든 이를 참고로 만든 Data객체는 다음과 같다.

데이터 전송이 간단하다보니 클래스의 구성도 간단해서 별도의 주석이 더 필요하다고는 생각되지 않지만, 인터페이스를 구현하는데에 반드시 구현되어야 할 메소드들이 몇가지 있고(자동 생성된다) 또한 CREATOR라는 Parcelable.Creator 객체를 만들어줘야 한다는 점. 이렇게 Data클래스를 수정한 후 에뮬레이터에서 작동을 시킨 결과는 다음과 같다.

IntentTest액티비티에서 Data dt 객체를 직접 putExtra로 전달 한 뒤 SubActivity에서 Data temp 객체에 getExtra를 이용해서 받은 뒤 약간의 가공을 거쳐 TextView에 전달 받은 내용을 성공적으로 출력했다.

Trackback 0 And Comment 0
prev | 1 | next