액티비티간 데이터 주고 받기 :: 안드로이드 설치 및 개발[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

안드로이드 설치 및 개발
[1]
등록일:2018-07-21 09:54:42 (0%)
작성자:
제목:액티비티간 데이터 주고 받기

액티비티간 데이터를 주고 받으려면 인텐트에 데이터를 넣어 보내면 됩니다~





intent의 putExtra 메서드를 사용하여 인텐트에 데이터를 넣습니다.

첫번째 인자는 나중에 데이터를 꺼내기 위한
두번째 인자는 전달할 데이터입니다.

 




 


putExtra는 타입별로 오버로딩이 되어 있기 때문
문자열 말고도 int, float, byte, 배열 등등 다양한 데이터를 넣을 수 있습니다.

심지어 사용자 정의 클래스도 약간의 수정을 거치면 인텐트에 집어넣을 수 있으니 사실상 모든 데이터를 다 전달할 수 있지요~

(※ 단, 네트워크와 관련된 객체(HttpClient) 같이 일부 특수한 클래스는 인텐트에 담을 수 없습니다!) 

 





데이터 적재를 마친 인텐트는 전과 똑같이 startActivity 메서드를 사용하여 보내주면 됩니다~

 



그 다음 SubActivity.java 파일로 이동합시다.


startActivity로 보낸 인텐트는 목적지 액티비티(SubActivity)에서 getIntent 메서드를 호출하면 고스란히 가져올 수 있습니다.






그리고 이렇게 intent의 get타입명Extra 메서드를 호출한 뒤,

아까 putExtra로 지정했던 데이터의 키값을 지정하면 해당하는 데이터 값이 나오게 됩니다!




지정한 키값에 맞는 데이터가 없으면 null이 반환됩니다.




'두 번째 액티비티로 넘어갈 때 앱이 자꾸 꺼져요 ㅠㅠ' 하시는 분은

putExtra로 지정한 키get타입명Extra의 키를 다르게 입력하지 않았는지 확인하시기 바랍니다.














아래는 액티비티간 데이터를 전달하는 방식을 택배에 빗댄 그림입니다.



(매우 과도하게 친절한 설명)


이제 완전히 이해가 되었지요? 








******************* 2015년 1월 6일 추가됨 *******************



참고로 이렇게 하나의 인텐트에 여러 개의 데이터를 넣을 수도 있습니다.

 

데이터를 꺼낼 때도 마찬가지로 get타입명Extra 메서드를 여러번 사용하시면 됩니다.

 

 

여기서 미처 설명하지 못한 주의할 점이 하나 있는데,


int나 float 같은 객체가 아닌 기본 타입의 데이터를 꺼내실 때는 두번째 인자에 반드시 기본값을 지정하셔야 합니다.

기본값은 지정한 키에 해당하는 데이터를 찾을 수 없을 때 대신 반환할 값을 말합니다.


 ****************************************************







한번 메인 액티비티에서 사용자가 입력한 아이디를 가져와 두번째 액티비티로 전달해 보도록 하겠습니다.

 


사진처럼 사용자가 입력한 아이디를 가져온 뒤 인텐트에 넣어 두번째 액티비티로 보냈습니다.

 




두번째 액티비티에서는 입력한 아이디가 있으면 아이디를, 없으면 없다고 토스트로 띄우도록 했습니다.

 





           


실행화면입니다.

두개를 같이 놓으니 정신 없네요;;







이번에는 이렇게 사용자 정의 클래스를 전달하는 방법을 알아봅시다.



 




먼저 Serializable 인터페이스를 구현하여 클래스를 직렬화할 수 있도록 합니다.

 






그리고 똑같이 putExtra 메서드를 사용하여 인텐트에 집어넣습니다.

 






SubActivity에서 데이터를 꺼낼 때는 getSerializableExtra 메서드를 사용합니다.


이 메서드는 무조건 Serializable 타입을 반환하니 데이터의 타입에 맞게 캐스팅을 해주셔야 합니다.

(잘못된 타입으로 캐스팅하면 앱이 즉사하니 주의하시기 바랍니다.)



 



데이터가 제대로 전달되는지 한번 토스트를 통해 확인해보겠습니다.




 


실행 결과입니다.




데이터를 전달하는 방법을 알아봤으니 이번에는 실행한 액티비티로부터 응답을 받는 방법을 알아보겠습니다.

 

 

우선 응답을 받으려면 startActivity가 아니라 반드시 startActivityForResult를 호출하여 액티비티를 실행해야 합니다.

startActivityForResult: 결과 값을 얻기 위해 액티비티를 시작한다.
메서드 이름이 매우 직관적이죠.

 


첫번째 인자에는 인텐트, 두번째 인자에는 요청코드를 집어넣으면 됩니다.


요청코드는 실행한 액티비티를 구분하기 위해 지정하는 숫자입니다.


결과를 돌려받을 때 요청코드를 보고 어떤 액티비티가 결과를 반환했는지 알 수 있습니다.

값은 음수를 제외한 아무 숫자나 주면 됩니다.





자, 목적지 액티비티(두번째 액티비티)로 이동합시다.

 


자신을 실행한 액티비티에게 돌려줄 결과setResult 메서드로 설정합니다.





위처럼 단순히 결과 코드만 지정할 수도 있고



이렇게 인텐트를 사용하여 데이터를 첨부할 수도 있습니다.

마지막으로 출발지 액티비티에 결과 값을 받을 메서드를 오버라이딩 합시다.
 





다시 메인 액티비티로 돌아갑니다.

 
 


위와 같이 onActivityResult를 오버라이딩합니다.
(클래스 안에다 오버라이딩 할 메서드를 바로 입력하면 더 쉽다고 했던 거 기억 나시죠?)



onActivityResult는 startActivityForResult로 실행한 액티비티가 종료되면 호출되며,

종료된 액티비티가 setResult 메서드로 설정한 결과 코드데이터(인텐트를 첨부했을 때만)가 전달됩니다.


첫번째 매개변수는 startActivityForResult에서 사용했던 요청 코드고,
두번째 매개변수는 종료된 액티비티가 setResult로 지정한 결과 코드입니다.

마지막 매개변수종료된 액티비티가 인텐트를 첨부했으면 그 인텐트가 들어있고, 첨부하지 않았으면 null입니다.







 


startActivityForResult를 여러 번 사용할 땐 이런 식으로 switch 문을 사용하여 어떤 요청인지 구분하여 사용해야 합니다.

[본문링크] 액티비티간 데이터 주고 받기
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34749
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.