Intent는 컴포넌트끼리 주고받을 수 있는 메세징 객체라고 했다.
데이터를 담아서 Intent를 전달할 수 있다.
가장 흔하게 사용되는 경우는 Activity끼리 정보를 전달할 때,
Extras에 Key-Value로 데이터를 저장하고 전달하는 예가 있다.
1. 데이터를 전달하는 방법들과 생각
2. Intent 데이터 공유를 이해하기 위한 개념
1. 데이터를 전달하는 방법들과 생각
잠시 화제를 전환하여, 데이터 전달하는 방법에 대해서 생각해보자.
1) Application Context를 공유하는 RoomDB를 통해 저장 후 사용
2) Application Context를 공유하는 Preference, DataStore사용
3) File로 저장하여 URI를 통해 정보 전달
4) Singletone객체로 데이터를 저장하여 사용
5) Intent를 사용하여 전달
6) ViewModel을 통해서 전달
더 많은 방법이 있겠지만, 위의 5가지 정도로 정리해본다.
저장방법, 저장위치 , 일회성인지 아닌지 등 다양한 상황에 맞는 다양한 방법들이 동원될 수 있으니
Android Developer페이지를 적극 활용하자.
1)의 경우는 DB를 만들고 준비하는 과정이 필요하고, 일회성 데이터의 경우에는 좋지 못한 선택이다.
2)의 경우에도 일회성으로 사용하는 경우에는 안좋다.
무엇보다도 1) 2)의 경우는 Application Context 즉 하나의 어플 내에서 데이터를 주고받는 경우에 사용할 수 있다.
말 그대로 다른 Application에게 데이터를 전달하기에는 적절하지 않다.(4,6도 마찬가지임)
3)도 저장 위치(내, 외부 저장소)에 따라 앱 간이 데이터 전달이 불가능할 수 있다.
그럼 Intent를 사용하여 데이터를 넘기는 경우에 불편한 경우는 뭐가 있을까?
Intent는 큰 용량의 정보를 넘기지 못하는 한계가 있다.
타 Application Context의 Component에 큰 용량을 넘기는 경우는 적기 때문에 별 문제가 될 거라 생각하지 않는다.
(물론 큰 데이터 넘기는 경우는 외부 저장소를 사용한 방법을 이용할 수 있을 것임)
정리하자면, 다른 어플리케이션과의 통신을 위해서는 Intent가 가장 적절하다고 생각하고,
같은 앱 내부에서 데이터 전달은 다양한 방법을 통해서 시도할 수 있다.
같은 Application내에 큰 데이터는 어떻게 넘기는 게 좋을까?
그 방법은 Application의 크기에 따라서 다르겠지만, 위의 3) 4)를 통해서 전달하면 될 것이다.
(사실 크면 Model을 Singletone으로 만들어 필요시마다 불러주는 게 맞는 듯? 아래에 정리)
이제 ViewModel의 이용에 대해서 고민해보자.
ViewModel의 LifeCycle은 해당 View에 종속되어있다.
이 말은 Application LifeCycle이 아니라 Activity나 Fragment의 생명주기에 종속되어있다는 말이다.
Activity 간의 데이터 전달에 ViewModel을 사용할 수 있을까?
위에 언급한 생명주기에 따라 힘들지 않을까?
그럼 ViewModel의 생명주기를 Application LifeCycle에 종속하여 사용하면 안 되나??
위의 물음은 Architecture에 따라서 말이 안 되는 구조라고 볼 수 있다.
ViewModel의 역할은 UI에 데이터를 표현하기 위한 정보를 담는 ViewStateHolder이다.
데이터 자체를 Singletone으로 관리하려면 ViewModel이 아닌 Model을 Singletone으로 사용하는 게 맞다.
하지만 Model을 사용해서 데이터를 가지고 오게 되면,
Activity에서 전달되는 것이 아니라 같은 Data를 새로 Instance 하여 사용하는 의미가 된다.
이외에 Data양이 적을 경우에는 Singletone 객체를 만들어, 같은 Application LifeCycle에서 사용은 것도 괜찮은 방법이 될 것 같다.
Activity에 파편화되어 존재하는 Fragment의 경우는 Activty LifeCycle에 종속된 ViewModel을 통해서 전달하면 아주 편하게 사용할 수 있다.
2. Intent 데이터 공유를 이해하기 위한 개념
다시 본론으로 돌아와서 Intent로 데이터를 넘길 때 사용하는 개념들에 대해서 간략하게 알아보자
1) 직렬화
데이터를 바이트코드로 변환시켜 다른 환경에서 재구성할 수 있는 포맷으로 변환시키는 것.
내가 보낼 때는 내가 인식할 수 있는 완전한 모습이라면 프로그램끼리의 전달은 010010~~로 이루어진 데이터임
직렬화를 통해서 Object의 상태를 저장하고 이를 다른 위치에서 그 상태를 가진 Object를 역직렬화로 새로 만든다.
쉽게 말해서 데이터의 원본을 주고받기 위해서 Data Stream을 처리하는 과정을 직렬화(역직렬화)라고 한다.
이러한 직렬화는 다양한 방법이 있는데
(1) XML
(2) JSON
(3) 언어 자체에서 지원하는 직렬화 (Serializable Interface[JAVA], Parcelable[Android]) 가있다.
2) reflection
객체의 정보에 직접 접근할 수 있는 API로 아직 사용은 해보지 못했다.
어떻게 사용하는지 감이 안 잡히는데, 누군가가 블루투스 사용 시에 히든 메소드를 사용할 때 썼다는 글을 본 것 같다.
Reflection은 사용시에 주의를 하여 사용을 하라고 많은 사람들이 주의를 올려두었다.
Reflection은 동적으로 Run-time에 정보를 찾아낸다. 정적으로 Compile-Time에 메모리에 올려놓는 일반적인 객체 생성 방식과는 다르다. 이 방법을 통해 아래의 Serializable이 동작한다고 한다.
아래에 예제와 설명이 잘 되어있어서 가져와봤다.
https://codechacha.com/ko/reflection/
Java - Reflection 쉽고 빠르게 이해하기
자바의 리플렉션(Reflection)은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있습니다. Reflection은 Class, Constructor, Method, Field와 같
codechacha.com
3) Serializable / Parcelable
Serializable Interface는 JVM에게 직렬화 해야 하는 객체임을 알려주고
(직렬화 객체라는 것만 알려주는 역할을 하므로 마커 인터페이스라고 함)
JVM은 이를 직렬화 한다.
Serializable은 Reflection을 사용하는 과정을 거치게 되는데, 이는 런타임 도중에 쓸모없는 객체들을 생성시키고 이 것들은 GC 타깃이 되면서 시스템의 자원을 소모하게 된다. 이는 성능에 영향을 미친다.
그럼 Parcelable은 뭔가?
JDK가 아닌 Android SDK에서 제공하는 직렬화 인터페이스로 Reflection을 사용하지 않아 성능면에서는 더 빠르다고 한다.
다만 사용자가 직접 정의를 해줘야 하는 부분이 존재하는 단점이 존재한다.
(Serializable도 직접 정의를 통해서 성능개선을 할 수 있다고 한다)
아래의 게시글은 Serializable과 Parcelable 잘 설명해준 블로그로 아래의 작성자의 말처럼 사용자의 눈에 띄지도 않을 성능 차이의 개선에 집중하기보다는 사용자가 필요한 니즈에 맞추어 잘 동작하는 Application을 개발하는 게 더 맞는 거 같다.
Parcelable vs Serializable , 정말 Serializable은 느릴까?
원문 : “Parcelable vs Serializable”
medium.com
4) Bundle
Bundle은 정말 단순함
A mapping from String keys to various Parcelable values.
Map형태로 직렬화가능한 데이터들을 저장하는 포장지와 같다고 생각하면 되고,
이와 Intent를 이용하여 데이터를 전달할 수 있다.
Compose를 사용하기 이전에 나는 Bundle을 통해서 Fragment에서 Dialog의 응답을 주고받을 때 많이 사용했었다.
이외 참조
Android Bundle이란?
Bundle이란? Bundle은 여러가지의 타입의 값을 저장하는 Map 클래스이다. 예를 들면 string 값을 Bundle 클래스에 Mapping(대응, 변환)하는 것이다. 기본타입인 int, double, long, String 부터 FloatArray,..
www.crocus.co.kr
https://thisisnew-storage.tistory.com/10?category=815046
리플렉션(Reflection) -1
관상(觀相)이라는 단어를 아시나요? 관상이란 사람의 생김새를 보고, 그 사람의 운명이나 성격 같은 정보를 알아내는 점법인데요. 자바에도 객체를 통해 그 객체의 원래 클래스와 그에 따르는
thisisnew-storage.tistory.com
'안드로이드 읽어보기 > 2.Intent' 카테고리의 다른 글
2)Android pendingIntent에 대해서 (0) | 2022.04.24 |
---|---|
1) Android Intent에 대해서 (0) | 2022.04.23 |