안드로이드 - 인텐트 (Intent)

Min Young Kim·2022년 10월 12일
0

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단계

  1. 직렬화된 객체를 바이트 단위로 분해한다. (marshalling : 데이터를 바이트의 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업)
  2. 직렬화 되어 분해된 데이터를 순서에 따라 전송한다.
  3. 전송 받은 데이터를 원래대로 복구한다. (unmarshalling)

Parcelable

  • Android SDK 에서 제공하는 직렬화 인터페이스이다.
  • 내부적으로 Reflection 을 사용하지 않게 설계되어있지만 개발자가 직렬화 처리방법을 명시해야한다.
  • 그렇기 때문에 성능상의 이점을 가지지만 보일러플레이트 코드 증가, 유지보수 복잡성 증가등의 단점이 있다.
  • 코틀린의 @Parcelize 를 이용하면 Parcelable 을 더 손쉽게 이용 가능하다.
profile
길을 찾는 개발자

0개의 댓글