
From. https://developer.android.com/guide/components/intents-filters
이 전 포스팅에서 Activity 를 다뤘기에, activity 와 밀접한 연관이 있는 Intent 를 다루도록 해보자
인텐트
- 안드로이드 시스템에서는 A 액티비티가 시스템에 의뢰를 하면, 시스템이 B 액티비티를 실행시키는 구조
- 인텐트는 "컴포넌트를 실행하기 위해 시스템에 넘기는 정보" 라고 표현 할 수 있다.
- 실행하고자 하는 컴포넌트 정보를 담은 인텐트를 구성해서 시스템에 넘기면 시스템에서 인텐트 정보를 분석해 맞는 컴포넌트를 실행해주는 구조
- 인텐트를 사용하면 컴포넌트간 결합도가 낮아져서, 유지보수성이 좋아진다.
명시적 인텐트
- 실행하고자 하는 컴포넌트의 클래스명을 인텐트에 담는 방법 (같은 앱의 컴포넌트를 실행할때 주로 사용)
- 인텐트를 시스템에 의뢰하는 함수 startActivity() 를 활용한다.
암시적 인텐트
-
클래스명이 아닌 Intent Filter 정보를 활용(클래스명을 알 수 없는 외부앱의 컴포넌트를 실행할 때 이용)
-
AndroidManifest.xml 파일에 정의된 intent-filter 정보와 동일한 값을 주어서 실행함
-
암시적 인텐트에 사용되는 인텐트 필터에는 action, category, data 태그가 있음
-
action : 컴포넌트가 어떤 능력을 갖추고 있는지에 대한 문자열
-
category : 어느 범주의 컴포넌트인지를 표현하는 데 사용
-
data : 컴포넌트를 실행하기 위해 필요한 데이터에 대한 상세 정보를 명시하기 위해 사용
-
intent-filter 에 를 꼭 선언해줘야 함
-
인텐트에 담긴 category 정보가 intent-filter 안에 있으면 실행 가능
-
data 정보는 URL 문자열로 Uri 객체로 표현됨
인텐트로 액티비티간 데이터 전달
- Extra 데이터를 사용하여 액티비티 사이에 데이터를 전달할 수 있음
- 인텐트가 발생하기 전에 putExtra() 함수를 이용하여 데이터를 인텐트 객체에 담아서 전달
- 데이터를 key, value 성격으로 담고 문자열, 숫자, boolean, 객체 등 모든 타입의 데이터를 넘길 수 있음
- getIntent() 함수로 인텐트 객체를 얻어서 사용
결과 되돌리기
- 인텐트로 실행한 activity가 자동으로 종료되고 다시 돌아오게 하려면 startActivityForResult() 함수를 사용한다.
- startActivityForResult(intent, 10) 에서 두번째 매개변수는 requestCode 값으로 개발자가 0 이상의 값을 임의로 지정하여 어느 요청이 되돌아온것인지 구별하기 위해 사용함
- setResult() 함수로 상태를 지정 가능, Result_OK 로 지정하여 액티비티가 완료 되었다는 것을 알림
Serializable vs Parcelable
Serializable
-
Java의 표준 인터페이스로 구성이 간편하고 사용하기 편리하다
-
Reflection 을 사용하여 직렬화를 처리하며, 처리 과정 중에 많은 추가 객체를 생성하여 성능 저하, 배터리 소모, 속도가 느려지는 등의 단점이 있다.
-
직렬화 란?
-
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)를 통틀어서 이야기한다.
-
직렬화의 장점 : 입출력형식에 구애받지 않고 객체를 파일에 저장함으로써 영속성을 제공함, 객체를 네트워크를 통해 손쉽게 교환할 수 있음
-
Reflection 이란?
- 객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법
-
구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해 클래스의 정보를 알아내어 사용 가능
-
객체 전송의 3단계
- 직렬화된 객체를 바이트 단위로 분해한다. (marshalling : 데이터를 바이트의 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업)
- 직렬화 되어 분해된 데이터를 순서에 따라 전송한다.
- 전송 받은 데이터를 원래대로 복구한다. (unmarshalling)
Parcelable
- Android SDK 에서 제공하는 직렬화 인터페이스이다.
- 내부적으로 Reflection 을 사용하지 않게 설계되어있지만 개발자가 직렬화 처리방법을 명시해야한다.
- 그렇기 때문에 성능상의 이점을 가지지만 보일러플레이트 코드 증가, 유지보수 복잡성 증가등의 단점이 있다.
- 코틀린의 @Parcelize 를 이용하면 Parcelable 을 더 손쉽게 이용 가능하다.