2014년 3월 7일 금요일

[Android][번역] Intents and Intent Filters - 2.1

원본 : http://developer.android.com/guide/components/intents-filters.html

Building and Intent
Intnet 객체는 시스템이 어떠한 component를 실행 시킬 지 결정 하는 정보를 가지고 있다 (정확한 클래스 이름 또는 Intent를 받을 수 있는 component 항목과 같은 정보), 추가로 Intent를 받는 component가 제대로 된 기능을 수행 할 수 있도록 하는 정보(기능을 수행하고, 데이터에 따라 수행 하도록 하는 것)도 가지고 있다.

Intent가 가지고 있는 주요한 정보는 다음과 같다.

 - Component name
실행하는 Component의 이름

이것은 부가적인 것이지만, Intent를 explicit 하게 만드는 매우 중요한 정보 중의 하나 이다. Intent가 오직 component 이름으로 정의된 app component에 전달 될 수 있음을 뜻한다.
Component 이름이 없는 Intent는 implicit이고 시스템은 component가 다른 Intent 정보를 기반으로 한 Intent를 받을 수 있도록 결정 한다.(action, data 그리고 category - 아래에 나열된 것들). 그래서 만약 App에서 특정 component를 실행 할 필요가 있다면, component 이름을 명시해 주어야 한다.

Note : Service를 실행 할 때에는, 항상 component 이름으로 실행 하여야 한다. 그렇지 않으면 Service가 Intent에 응답 하는 것을 확신치 못하며, Service가 실행 되는 것을 알 수가 없다.

이 Intent의 부분은 ComponentName 객체 이다. app의 패키지 이름을 포함한 목표 component의 완전히 증명된 클래스 이름을 명시 할 수 있다. 예) com.example.ExampleActivity. component 이름은 setComponent(), setClass(), setClassName() 또는 Intent 생성자로 설정 할 수 있다.

 - Action
일반적인 기능 수행(view 또는 pick)을 명시한 String.

broadcast Intent의 경우, 이것은 실행하고 보고 하는 action 이다. 그 action 은 주로 나머지 intent가 어떻게 구성되어졌는데 알아낸다. - 특히 어떤 data와 extra가 포함되어 있는지.

App에서 intent를 이용한 자신만의 action을 명시 할 수 있다. (또는 다른 앱의 component를 적용 하기 위한 action), 하지만 Intent 클래스 또는 다른 framework 클래스에 정의된 action 상수를 사용하는 것이 좋다.

Activity를 실행하기 위한 일반적인 action들이 있다.

 ACTION_VIEW
갤러리 App의 사진 또는 맵 App의 주소와 같은 정보를 Activity에서 사용자에게 보여줘야 할 때 이 Action을 가지고 있는 Intent와 startActivity()를 사용 하면 된다.

 ACTION_SEND
이것 역시 "공유" Intent로 알고 있는것으로, 사용자가 Email App 또는 소셜 공유 App을 통해서 공유 할 수 있는 어떠한 데이터를 가지고 있다면 이 때 이 Action을 포함한 Intent와 startActivity()를 사용 하면 된다.

일반적으로 사용되는 Action을 정의한 더 많은 상수들은 Intent 클래스 참조를 통해 볼 수 있다. 시스템의 설정 App에서 특정 화면을 보여주는 Action이 Setting 클래스에 정의 되어 있는것과 같이 안드로이드 framework의 어딘가에 다른 Action들이 정의되어 있다.

Action은 setAction() 또는 Intent 생성자로 명시 할 수 있다.

만약 자신만의 Action들을 정의 한다면, 접두에 App의 패키지 이름을 포함 하여야 한다.

예)







2014년 3월 3일 월요일

[Android][번역] Intents and Intent Filters - 1

원문 : http://developer.android.com/guide/components/intents-filters.html

Intents and Intent Filters

Intent는 다른 app component에 기능을 요청 할 수 있는 메시징 객체이다.
비록 Intent가 components 간의 Communication을 가능 하게 하는 여러 방법이 있지만
세가지의 근본적인 사용 방법이 있다.

 - Activity 시작
Activity는 App에서 단일 화면을 표현해 준다. 새로운 Activity 객체를 시작할 땐 startActivity()로 Intent를 전달 해 준다. Intent는 Activity를 시작하기위한 설명과 필요한 데이터를 가지고 있다. 만약 새로 시작 한 Activity가 끝날 때 결과를 받고 싶다면 startActivityForResult()를 호출 하면 된다. 결과를 받고자 하는 Activity에서는 Intent 객체와는 별개로 onActivityResult() callback을 통해서 결과를 받을 수 있다.

 - Service 시작
Service는 UI가 없이 백그라운드에서 기능을 수행하는 Component이다.
Service에서 one-time operation(파일 다운로드와 같은) 기능을 startService()로 Intent를 전달 하여 시작할 수 있다. Intent는 Service를 시작하기위한 설명과 필요한 데이터를 가지고 있다. 만약 Service가 client-server 로 디자인 되어있다면, Intent를 bindService()를 통해 전달 하여 다른 app component와 묶을 수 있다.

 - Broadcast 전달
broadcast는 어떠한 App에서도 받을 수 있는 메시지 이다. 시스템은 시스템 전원 켜짐 또는 기기가 충전을 시작하는 등 과 같은 시스템 이벤트를 위한 여러가지 broadcast들을 전달 한다. broadcast는 sendBroadcast(), sendOrderedBroadcast() 또는 sendStickyBroadcast()로 Intent를 전달하여 다른 app에 broadcast를 전달 할 수 있다.


Intent Types

두 가지의 Intent 타입이 있다.

 - Explicit intents는 이름 (완전히 증명된 클래스 이름)으로 시작하는 component를 명시한다. 일반적으로 앱에서 explicit intent로 component를 시작한다, 시작 하고 싶은 Activity 또는 Service의 클래스 이름을 알기 때문이다. 예로, 사용자의 행동에 응답하는 새로운 Activity를 시작 하거나 백그라운드에서 파일을 다운받는 Service를 시작하는게 있다.

 - Implicit intents는 component의 이름을 명시하것이 아니라, 다른 app의 component가 기본적인 기능을 수행 할 수 있도록 허용하는 것이다. 예로, 만약 사용자의 위치를 지도에 표시 해 주고 싶다면 implicit intent로 지도에 구체적인 위치를 보여줄 수 있는 다른 app에 요청 하는 것이다.

Activity 또는 Service를 explicit intent로 생성 할 때, 시스템은 즉시 intent 객체에 명시 된 app component를 시작 한다.

implicit intent를 생성 할 때, 안드로이드 시스템은 기기의 다른 앱의 manifest 파일에 선언된 intent filter와 intent의 내용을 비교하여 적절한 component를 찾는다. 만약 그 intent가 intent filter와 일치 한다면 component를 실행하고 intent를 전달 해 준다. 만약 여러 intent filter와 호환이 된다면, 시스템은 사용자가 고를 수 있도록 실행 가능 한 목록을 보여준다.

intent filter는 app의 manifest 파일에 component가 받을 수 있는 intent 종류를 명시한 식(expression)이다. 나아가서 하나의 Activity에 intent filter를 선언 하면, 다른 app에서 intent filter에 명시한 종류의 intent로 intent filter가 선언된 Activity를 직접 실행 시키도록 만들 수 있다.  비슷하게 Activity에 아무런 intent filter를 선언하지 않으면 이 Activity는 explicit intent로만 실행 할 수 있다.



* 주의 : App의 보안을 보장하려면 항상 Activity 또는 Service를 시작하려면 explicit intent를 사용하고 Service에 intent filter를 선언하지 마라. implicit intent로 Service를 시작하는 것은 보안의 위험 요소이다. Service가 intent에 응답 할 것을 확신하지 못하고, 사용자는 Service가 실행되는것을 보지 못하기 때문이다.