목차
1. The Intent Class
A. 수행되어야 할 오퍼레이션을 표현
B. Intent 필드
Action
Data
Category
Type
Component
Extras
Flags
2. Starting Activities with Intents
A. Implicit Activation
Intent Resolution Data
Intent Resolution Process
B. 기타
3. 시리즈 연재
1. The Intent Class
안드로이드 시스템에서 요청 및 이벤트에 해당하는 기능을 처리하는 클래스이다. Intent 클래스는 다음 두 역할을 한다.
수행되어야 할 오퍼레이션을 표현
이미 발생한 이벤트를 표현
2번의 경우는 BroadcastReceivers를 통해서 시스템 이벤트를 통지할 때 사용될 때의 역할이다. BroadcastReceivers는 이후 포스팅에서 다룰 예정이다. 1번은 Activity를 런칭 할 때 사용되는 역할인데 아래 두 가지 중에 하나의 방식에 의해서 Activity는 런칭된다.
Explicit Activation : 실행시킬 Activity의 이름을 명시
Implicit Activation : 시스템에서 적절한 Activity를 선택해주는 방식
A. 수행되어야 할 오퍼레이션을 표현
Intent는 수행되어야 할 오퍼레이션을 표현하기 위해서 유연한 방식을 채택하고 있다. 아래는 수행되어야 할 오퍼레이션의 예이다.
연락처 하나 선택하기
사진 한장 찍기
특정 번호로 전화 걸기
항상 Intent 만드는 컴포넌트와 Intent를 받는 컴포넌트가 존재하게 된다. 만드는 컴포넌트의 경우, 특정 요청을 하는 컴포넌트가 되고 받는 컴포넌트의 경우, 해당 요청을 수행할 수 있는 컴포넌트가 된다.
B. Intent 필드
수행되어야 할 오퍼레이션이나 이벤트를 표현하기 위해서 intent 내에는 많은 필드가 존재한다. 아래와 같은 필드들이며 각 필드별로 특징을 알아본다.
Action / Data / Category / Type / Component / Extras / Flags
Action
문자열이다. 수행해야 하는 오퍼레이션을 표현한다. 안드로이드에 이미 정의된 문자열을 사용하게 되며 아래와 같은 정의된 오퍼레이션들이 존재한다. 함수 호출로 표현하자면 함수명이라고 생각하면 된다.
ACTION_VIEW: 새로운 화면을 띄운다.
ACTION_DIAL: 전화걸기
ACTION_EDIT: 편집을 위해 데이터를 표시
ACTION_SYNC: 서버와 동기화 수행
ACTION_MAIN: 앱의 초기 (Main) activity를 시작시키는 Action
코드 예)
Intent newInt = new Intent(Intent.ACTION_DIAL); // 또는 Intent newInt = new Intent(); newInt.setAction(Intent.ACTION_DIAL);
Data
URI(Uniform Resource Identifier)이다. Intent와 관련된 데이터라고 생각하면 된다. Action이 함수명이라면 Data는 함수에 전달하는 파라메터 되겠다. 하나의 URI만 지정할 수 있어서 추가적인 데이터가 필요하다면 extra 필드를 사용한다.
ACTION_VIEW: 지도에 위치를 보여주기를 원할 때
Uri.parse(“geo:0,0? q=1600+Pennsylvania+ Ave+Washington+DC”)
ACITON_DIAL: 전화걸기를 원하는 전화번호
Uri.parse(“tel:+15555555555”)
코드 예)
Intent newInt = new Intent (Intent.ACTION_DIAL, Uri.parse("tel:+15555555555")); // 또는 Intent newInt = new Intent(Intent.ACTION_DIAL); newInt.setData(Uri.parse("tel:+15555555555"));
Category
Intent를 처리할 수 있는 컴포넌트에 대한 추가적인 정보가 기술되는 필드다.
Category_browsable: 전달되는 Data(URI)를 표시하기 위해서는 브라우저에 의해서 수행되어야 함을 표현
Category_launcher: 런처에 의해서 수행되는 initial activity임을 표현
Type
MIME 타입을 나타내는 필드이다. 아래와 같은 MIME 타입이 존재한다. 만약 기입되지 않으면 안드로이드 플랫폼에서 MIME 타입을 추측하게 된다.
image/*
image/png
image/jpeg
text/html
text/plain
코드 예)
Intent.setType(String type) // 또는 Intent.setDataAndType(Uri data, String type)
Component
intent 요청을 받아들이는 대상 컴포넌트를 의미한다. 플랫폼 상에 대상 컴포넌트가 명확하게 존재할 경우에 이 필드를 사용한다.
코드 예)
Intent newInt = Intent(Context packageContext, Class cls); // 또는 Intent newInt = new Intent (); and one of: setComponent(), setClass(), or setClassName()
Extras
key-value 쌍으로써 Intent와 관련된 어떤 데이터도 추가가 가능하다.
코드 예)
putExtra(String name, String value); putExtra(String name, float[] value); // 아래는 이메일 주소를 value 값으로 넘기는 예, Key는 약속된 값을 사용한다. Intent newInt = new Intent(Intent.ACTION_SEND); newInt.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "aporter@cs.umd.edu", "ceo@microsoft.com", "potus@whitehouse.gov", "mozart@musician.org" } );
Flags
intent가 어떻게 처리되어야 하는지 표현한다.
FLAG_ACTIVITY_NO_HISTORY: Don’t put this Activity in the History stack
FLAG_DEBUG_LOG_RESOLUTION: intent가 처리될 때, 로그레벨을 디버그로 변경
코드 예)
Intent newInt = new Intent(Intent.ACTION_SEND); newInt.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
2. Starting Activities with Intents
몇 번 이야기 했던 것 같은데 아래 두 가지의 API를 사용한다.
startActivity(Intent intent,…): 리턴 값이 필요 없을 때
startActivityForResult(Intent intent, …): 리턴 값이 필요할 때
Component 필드가 설정되어 있지 않으면 안드로이드 플랫폼에서 가장 적합한 Activity를 선택하게 된다. 만약에 여러 Activity가 있다면 유저에서 선택을 요청할 수 있다.
A. Implicit Activation
앞에서 언급했지만 Component 필드가 없으면 안드로이드 플랫폼에서 해당 Action을 처리할 적절한 Activity를 찾는 시도를 하게 된다. 이 Process를 Intent Resolution Process라고 부른다. 이 과정에서 사용하는 필드를 Intent Resolution Data라고 부른다.
Intent Resolution Data
아래 3가지 필드가 사용된다. 만약에 대상이 불명확한 intent에 대해서 처리를 원한다면 아래 3개의 필드를 자세히 채울 필요가 있다.
Action
Data (both URI & TYPE)
Category
Intent Resolution Process
이 프로세스는 두 개의 사전 정보를 바탕으로 처리가 된다.
Intent 자신이 Intent Resolution Data가 잘 표현되어 있을 것
Activity는 자신이 처리할 수 있는 Action들에 대해서 IntentFilter를 통해 자세히 표현되어 있을 것. AndroidManifest.xml에 정적으로 등록되어 있거나 java 코드에서 동적으로 등록될 수도 있다.
// DIAL action을 처리할 수 있음 <activity …> <intent-filter …> <action android:name=”android.intent.action.DIAL" /> </intent-filter> </activity> // geo schema로 표현된 Data를 처리할 수 있음 <intent-filter …> <data android:scheme=”geo" /> </intent-filter> |
Implicit Intent를 받기 위해서는 Activity의 IntentFilter에 Default 카테고리가 등록되어 있어야 한다.
"android.intent.category.DEFAULT”
아래 명령을 통해 플랫폼 상에 intent filter 상황에 대해서 확인해 볼 수 있다.
% adb shell dumpsys package
3. 시리즈 연재
'소프트웨어 > 안드로이드앱' 카테고리의 다른 글
[안드로이드 기초#6] 프래그먼트 (Fragment) (1) | 2015.07.04 |
---|---|
[안드로이드 기초#5] 권한 (Permission) (0) | 2015.07.03 |
[안드로이드 기초#3] 액티비티 (Activity) (0) | 2015.07.01 |
[안드로이드 기초#2] 어플리케이션 기본 (0) | 2015.06.30 |
[안드로이드 기초#1] 플랫폼과 개발환경 (1) | 2015.06.29 |