빙글 면접이 다음주 월요일로 다가왔다.
그래서 안하던 공부를 좀 해보려구 한다!
누군가 Intent에 대해 설명해주세요. 라고 물어봐서
라고 대답한적이 있다. 다소 여러모로 아쉬운 대답이다.
인텐트는 액티비티 시작, 서비스 시작, 브로드캐스트 전달등 많은 상황에서 사용된다. 안드로이드에서 A액티비티에서 B액티비티를 시작할때 아마 한번쯤은 왜 인텐트를 사용하는지 고민을 해봤을 것이다
Intent는 일종의 메시지 객체이다.
여러 구성 요소 사이의 통신을 용이하게 하는 데에 몇가지 방법이 있지만 기본적으로 3가지로 사용된다.
1. 액티비티를 시작할 때
Activity의 새 인스턴트를 시작하려면 Intent를 startActivity()로 전달하면 된다. Intent는 시작할 액티비티를 설명하고 모든 필수데이터를 가지고 있다. 또한 Activity가 완료 되었을 때 결과를 수신하려며느 startAcitivtyForResult()를 사용하여 해당결과가 있는 Activity의 onActivityResult() 콜백에서 Intent 객체를 수신해서 사용하면 된다.
2. 서비스가 시작할 때
Service는 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성 요소이다. 서비스를 시작하여 작업을 수행하도록 하려면 Intent를 startSerice()에 전달하면 된다. (데몬 서비스일때)
서비스가 클라이언트 - 서버 인터페이스로 디자인 된 경우, 다른 구성요소로부터 서비스에 바인드하려면 Intent를 bindSercvice()에 전달하면 된다.(원격 서비스일때, 구현해보도록 하자 은근 헷갈린다 XD)
3. 브로드캐스트 전달할 때
Broadcast는 모든 앱이 수신할 수 있는 메시지이다. 시스템과 third party는 여러 이벤트에 대해 다양한 브로드캐스트를 전달하며, 예를 들어 시스템이 부팅될 때, 수신등이 있다. 상황에 따라 정적리시버를 사용할지 동적리시버로 구분된다 전자는 한번 등록하면 해제 할수 없지만 후자는 등록과 해제가 자유로운 것이 장점이다.
인텐트 유형에는 2가지가 있다.
*명시적 인텐트
시작할 구성요소의 이름을 지정해주는게 큰 특징으로 이란적으로 본인의 앱안에서 구성요소를 시작할 때 주로 사용된다. 시작하고자 하는 액티비티 , 서비스 클래스의 이름을 알고 있기 때문이다, 예를 들어, 새로운 액티비티를 시작하거나 백그라운드에서 서비스를 시작하는 것 등이 해당된다.
*암시적 인텐트
특정 클래스나, 컴퍼넌트의 이름을 명시하진 않지만, 그 대신 수행할 일반적인 작업을 선언하여 또 다른 앱의 구성요소가 이를 처리할 수 있도록 해준다. 예를 들어, 사용자에게 인터넷 링크를 보여주고 싶어하는 경우, 브라우저기능을 갖춘 앱을 요청할수 있고, 여러 브라우저를 사용할 경우에는 사용자가 고를수 있도록 해줍니다.
명시적 인텐트를 생성하여 액티비티나 서비스를 시작하도록 하면, 시스템은 즉시 Intent객체에서 지정된 앱 구성요소를 시작한다.
암시적 인텐트를 생성하면 Android 시스템이 시작시킬 적절한 구성요소를 찾는데 이때, 인텐트의 내용을 기기내에 있는 다른 여러앱의 Manifest파일에서 선언된 인텐트 필터와 비교하는 방법을 사용한다. 해당 인텐트와 일치하는 인텐트 필터가 있으면 시스템이 해당 구성 요소를 시작하고 이에 Intent 객체를 전달한다. 호환되는 인텐트 필터가 여러개인 경우네는 사용자가 어느 앱을 사용할지 직접 선택할수 있도록한다.
인텐트 필터란
Manifest파일에 들어가 있는 표현으로, 해당 구성요소가 수신하고자 하는 인텐트 유형을 나타낸 것이다. 예를 들어 액티비티에 대한 인텐트 필터를 서언하면 다른 여러 앱이 특정한 종류의 인텐트를 가지고 여러분의 액티비티를 직접 시작할 수도 있다. 이와 같이 액티비티에 대한 인텐트 필터를 전혀 선언하지 않으면 명시적 인텐트로만 시작할수 있다.
인텐트는 안드로이드 시스템이 어느 구성요소를 시작할지 판별하는데 사용하는 정보가 담겨 있다(구성요소이름, 작업, 데이터, 카테고리, 엑스트라, 플래그 등 대부분은 한번씩은 사용해봤을 것이다.)
구성 요소 이름
이것이 인텐트를 명시적으로 만들어주는 중요한 정보이다. 구성요소 이름이 정의한 앱 구성 요소에만 전달 되어야한다는 의미이다. 구성요소의 이름이 없으면 인텐트는 암시적이며, 인텐트를 수신해야하는 구성 요소는 다른 인텐트 정보를 기반으로 시스템이 결정한다.
작업
일반적인 작업을 나타내는 문자열이다.
본인의 앱 내에 있는 인텐트가 사용할 작업(또는 다른 앱이 본인의 앱 구성요소를 호출하도록 하는 작업)을 직접 지정 하기도 하지만, 보통은 Intent 클래스나 다른 프레임 워크 클래스가 정의한 작업 상수를 쓰는편이다.
자주 사용하는 작업상수를 보자
ACTION_VIEW : 이 작업은 액티비티가 사용자에게 표시할 수 있는 어떤 정보를 가지고 있을때 사용한다. 주소를 보여주거나, 사진을 보여주는 행위가 이에 해당 된다.
ACTION_SEND : SHARE TO VIA~~ 에서 참 많이 본 이 작업 상수는 공유 인텐트라고도 불리며 어떤 정보를 가지고 있을 때 이메일 앱, 소셜 공유 앱에서 사용할수 있도록 해준다.
직접 정의 해서 사용 하는 경우는 앱의 피키지 이름을 접두어로 꼭 포함 시키자 static final String ACTION_SOMETHING = "live.nice.action.SOMETHING"
데이터
작업을 수행할 데이터 또는 데이터의 mime 유형을 참조하는 URI이다. 제공된 데이터의 유형을 나타내는 것이 일반적인 인텐트의 작업이다. 에를 들어 인텐트가 action_edit 인 경우, 데이터에 편집할 문서의 URI가 들어있어야 한다.
카테고리
인텐트를 처리해야 하는 구성요소의 종류에 관한 추가 정보를 담은 문자열이다. 인텐트 안에는 카테고리 설명이 얼마든지 들어있을 수 있지만, 대부분의 인텐트에는 카테고리가 없어도 된다.
예를 들어
CATEGORY_BROWABLE : 대상 액티비티가 스스로 웹 브라우저가 자신을 시작해도 되도록 헝ㅇ하여 링크를 참조된 데이터를 표시하게 한다. 이메일 메시지 등이 해당한다.
CATEGORY_LAUNCHER : 작업의 최초 액티비티이며, 시스템의 어플리케이션 시작 관리자 목록으로 게재된다.
엑스트라
요청한 작업을 수행하기 위해 필요한 정보를 담고 있는 KEY-VALUE 형식이다. 특정 종류의 데이터 URI를 사용하는 것과 마찬가지로, 몇몇 작업은 특정한 엑스트라를 사용한다.
엑스트라 데이터를 추가하려면 여러가지 putExtra메서드를 사용할수 있다. 이들은 데이터를 가진 Bunde 객체를 생성할 수도 있고, bundle을 인텐트에 넣어 사용한다.
예를 들어 ACTION_SEND로 이메일을 전송할 인텐트를 생성하는 경우 받는 사람을 지정할때 EXTRA_EMAIL키를 사용한 뒤 제목은 EXTRA_SUBJECT키를 사용해 지정해주면된다.
플래그
Intent 클래스에서 정의되어 있는 플래그로, 인텐트에 대한 메타데이터와 같은 기능을 한다. 이런 플래그는 Android 시스템에 액티비티를 시작할 방법에 대한 지침을 줄 수도 있고 액티비티를 시작한 다음에 어떻게 처리해야 하는지도 알려줄수 있다. 자주사용하는 인텐트 플래그는 FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_SINGLE_TOP 등이 있다.
'Android' 카테고리의 다른 글
Grab, Kakao T 같은 모빌리티 샘플 앱 구현하기 (0) | 2020.06.29 |
---|---|
안드로이드 Q (API 29) 관련 파일 저장 퍼미션 문제 (0) | 2019.11.17 |
커스텀 다이얼 로그를 만들어 보자(왕왕초보자) (0) | 2017.06.12 |
Apk는 어떻게 만들어지는 걸까? (0) | 2017.05.04 |
초보 개발자의 아주 간단한 커스텀 뷰 개발기 (0) | 2017.05.01 |