[안드로이드/Android] PART2 명시적 인텐트 암시적 인텐트에 대해서

Posted by 앱해피
2015. 6. 22. 19:12 안드로이드 이론

 

인텐트 생성하기(Building an Intent)

 

인텐트 객체는 정보를 전달하는데

1) 이 정보를 이용해서 시스템이 어떤 컴포넌트를 실행해야 할지 알 수 있으며

 

2) 인텐트에는 추가로 실행되는 컴포넌트가 자신이 제대로 동작하는데 필요한

정보도 포함하고 있다.

 

인텐트에 포함되는 핵심 정보는 아래와 같다.

 

#1 Component name

 

시행할 컴포넌트의 이름을 나타낸다.

 

컴포넌트 이름 정보는 옵션 사항이다. 하지만, 명시적 인텐트를 생성하기 위해서는 반드시 이 값을 입력해야 한다.(컴포넌트 이름에 해당하는 컴포넌트에만 명시적 인텐트가 전달되기 때문) 컴포넌트 이름이 없는 경우, 인텐트는 암시적 인텐트가 된다.

 

시스템에서 암시적 인텐트를 이용해서 자신이 실행해야 할 컴포넌트를 찾기 위해서는 인텐트에 추가 정보를 넣어야만 한다. (액션, 데이터, 카테고리 정보 등등)

 

[주의] : 서비스를 시작할 때, 컴포넌트 이름을 명시적으로 작성해야 한다. 특정 암시적 인텐트에 의해서 의도하지 않은 서비스가 실행될 가능성이 높기 때문이다.

 

인텐트에서 이 필드에 해당하는 데이터는 ComponentName 객체다. 이 객체에 어플리케이션의 패키지 이름을 포함해서 타겟 컴포넌트의 완전한 클래스 이름을 명시해야 한다. 또한 setComponent(), setClass(), setClassName() 또는 인텐트 생성자를 사용해서 컴포넌트 이름을 설정할 수 있다.

 

#2 Action

 

처리하고자 하는 일반적인 액션을 나타내는 문자열(ex. View or Pick)

브로드 캐스트 인텐트의 경우, 발생 되었거나 보고되어야 할 액션에 해당한다. 액션 정보에 따라서 인텐트를 구성하는 나머지 데이터가 어떻게 구성되어야 할지 결정된다.

 

개발되는 어플리케이션에서 자체적으로 사용할 액션 정보를 정의할 수 있다

 

하지만 Intent 클래스나 다른 프레임워크 클래스에서 미리 정의되어 있는 액션 상수값을 보통

사용한다. 여기에 액티비티를 시작시키기 위해서 일반적으로 사용되는 액션 정보가 있다.

 

1) ACTION_VIEW

 

갤러리 어플을 이용해 사진을 보여준다거나 지도 어플에서 주소 정보를 보여주는 것과 같이 유저에게 보여줄 수 있는 특정 정보를 가지고 있을 때, startActivity()에 사용되는 인텐트에 이 액션값을 사용한다.

 

2) ACTION_SEND

 

"공유" 인텐트라고도 불린다. 이메일 어플 또는 소셜 어플과 같은 어플을 통해서 공유하고자 하는 데이터가 있는 경우, startActivity()에 사용되는 인텐트에 이 액션값을 사용한다.

인텐트의 setAction()이라는 메소드를 통해서 또는 인텐트 생성자를 이용해서 액션정보를 등록할 수 있다.

 

어플리케이션에서 사용할 액션 정보를 정의할 때, prefix형태로 어플의 패키지 이름을 반드시 붙이자.

 

예시 static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

 

#3 Data

 

1) 처리되어야 할 데이터 또는 2) 그 데이터의 MIME 타입을 참조하는 URI 객체다. 인텐트에

제공되어야 할 데이터의 유형은 보통 인텐트의 액션 정보에 따라 달라진다. 예를 들어, 액션 정보가 ACTION_VIEW일 때, 데이터는 편집하고자 하는 문서의 URI를 포함해야 한다.

 

인텐트를 생성할 때, 데이터와 관련된 URI 뿐만 아니라 데이터의 MIME 유형을 명시하는 것도 중요하다. 예를 들어, 이미지를 출력하는 액티비티 같은 경우 비록 URI 형태가 비슷하더라도 오디오 파일을 재생하지는 않을 것이다. 그렇기 때문에 데이터의 MIME 유형을 명시하는 것은 안드로이드 시스템이 인텐트를 수신할 컴포넌트를 찾는 과정에서 도움이 된다. 하지만, MIME 유형은 때때로 URI를 이용해서 추론이 가능한 경우도 있다.

 

데이터 URI를 설정하려면 Intent 객체의 setData() 메소드를 호출하면 된다. 추가로 MIME 유형을 명시하기 위해서는 setType() 메소드를 호출한다. 두 가지를 한번에 명세하기 위해서는 setDataAndType()를 이용해서 설정한다.

 

[주의] : 데이터 URI와 MIME 유형을 둘다 설정할 때, 반드시 setDataAndTpye() 메소드를 사용해야 한다.setData()는 MIME 유형을 null로 만들고, setType은 URI를 null로 만들기 때문이다.

 

#4 Category

 

인텐트를 처리하는 컴포넌트와 관련해서 추가적인 정보를 담고 있는 문자열이다. 카테고리 정보는 인텐트 안에 포함될 수 있으나, 대부분 인텐트에서 카테고리를 필요로 하진 않는다. 일반적으로 사용되는 몇가지 카테고리 정보를 살펴보자

 

CATEGORY_BROWSABLE

 

타겟이 되는 액티비티는 링크에 의해서 참조되는 데이터를 보여주기 위해서 웹 브라우저에 의해 시작되는 것을 허용한다.

 

CATEGORY_LAUNCHER

 

해당 액티비티는 태스크의 초기 액티비티라는 것을 나타내며 동시에 이 카테고리 정보를 갖고 있으면 어플리케이션 런처 화면에 해당 어플리케이션이 보이게 된다.

 

인텐트의 addCategory() 메소드를 이용해서 카테고리 정보를 추가할 수 있다. 위에 열거한 속성들(컴포넌트 이름, 액션, 데이터 그리고 카테고리)은 인텐트의 특성을 나타낸다. 이 속성들을 확인함으로써, 안드로이드 시스템이 어떤 컴포넌트를 실행시켜야 할지 결정할 수 있다.

 

#5 Extras

 

하지만, 위에 열거된 정보 말고도 추가로 제공할 수 있는 데이터가 존재한다. 이 데이터는 실행할 컴포넌트를 결정하는데 영향을 미치지 않는다.

 

추가적인 정보를 제공하는 키-값 쌍으로 된 정보요청된 액션을 올바르게 처리하기 위해서

필요하다. 일부 액션은 데이터 URI와 같은 특별한 데이터만 필요로 하지만, 특별한 추가 데이터를

사용해야 하는 경우도 있기 때문에 이 데이터를 추가적으로 제공해야 한다.

 

putExtra() 메소드를 이용해서 데이터를 추가할 수 있는데, 각각의 메소드는 2개의 파라미터를 필요로 한다. 1) 키 이름 2) 값 데이터 그리고 여러가지 3)추가 데이터를 갖는 번들 객체를 생성할 수도 있다, 생성된 번들 객체를 putExtras()라는 메소드를 이용해서 인텐트에 삽입할 수 있다.

 

예를 들어, ACTION_SEND라는 액션 정보를 이용해서 이메일을 보내는 인텐트를 생성할 때, EXTRA_EMAIL 키를 사용해서 수신자를 지정할 수 있고, 그리고 EXTRA_SUBJECT 키를 사용해서 이메일의 제목을 정할 수 있다.

 

인텐트 클래스에서 표준 데이터 유형에 사용되는 많은 EXTRA_* 계열의 상수값을 정의하고 있다. 그렇기 때문에 자기 자신의 extra 키를 선언해야 할 필요가 있을 때, prefix로 패키지 이름을 붙여줌으로써 혹시 모를 키 값 중복을 예방할 수 있다.

 

예시) static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

 

#6 Flags

 

Intent 클래스에 정의된 플래그 값은 인텐트와 관련된 메타데이터 역할을 한다. 플래그 정보를 이용해서 안드로이드 시스템이 어떻게 액티비티를 실행해야 하는지 지시할 수 있으며 액티비티가 실행된 후에 어떤식으로 관리할 것인지 지시할 수 있다.