인텐트와 인텐트 필터 살펴보기
인텐트
인텐트(Intent)는 컴포넌트에 액션, 데이터 등을 전달하는 메시지 객체이다. 인텐트 객체의 구성 요소는 다음과 같다.
정리 Intent 객체의 구성 요소
▶ Action(액션): 수행할 액션 이름(ACTION_DIAL)
▶ Data(데이터): 수행할 데이터의 URI(tel:)
▶ Category(카테고리): 수행할 액션에 대한 추가적인 정보
▶ Type(타입): 수행할 인텐트 데이터의 명시적인 타입(MIME 타입)(video/mpeg)
▶ Component name(컴포넌트 이름): 대상 컴포넌트의 완전한 클래스 이름
▶ Extras(추가 정보): 인텐트를 다루는 컴포넌트에 추가적으로 전달할 한 쌍의 키/값
이 구성 요소를 활용하면 다른 애플리케이션의 액티비티를 실행하거나 데이터를 전달해줄 수 있다. 이 중에서 가장 중요한 요소는 Action이다. 액션은 액티비티와 브로드캐스트 액션으로 구분할 수 있으며 다음은 액티비티 액션 중에서 가장 자주 사용하는 것을 정리한 것이다.
API Intent의 주요 액티비티 액션
Action | 설명 |
---|---|
ACTION_MAIN | 시작 액티비티를 지정하기 위한 액션 |
ACTION_VIEW | 데이터의 URL로 가장 적절한 액티비티를 호출하는 액션 content://contacts/people/1 |
ACTION_DEFAULT | ACTION_VIEW와 동일 |
ACTION_EDIT | 수정하기 위해 호출하는 액션 |
ACTION_DELETE | 삭제하기 위해 호출하는 액션 |
ACTION_DIAL | 전화 다이얼 액티비티를 호출하는 액션 content://contacts/people/1 tel:0101235678 |
ACTION_CALL | 전화 액티비티를 호출하는 액션 tel:0101235678 |
ACTION_WEB_SEARCH | 웹 검색 액티비티를 호출하는 액션 |
ACTION_SEARCH | 검색 액티비티를 호출하는 액션 |
ACTION_SENDTO | 이메일 등의 메시지 전송을 지정하는 액션 |
ACTION_ANSWER | 전화 착신을 위한 액션 |
※ 참고로, content://contacts/people/1는 주소록에서 식별자가 1인 사람에 대한 정보를 가리키며, tel:0101235678는 전화번호 0101235678을 가리킨다.
다음 코드는 인텐트를 사용해서 데이터를 전달하고 받는 코드이다. 이에 대한 자세한 얘기는 이 책의 다른 부분에서 살펴보도록 하겠으니 "지금은 인텐트를 이렇게 사용할 수 있구나" 정도만 생각하기 바란다.
코드 인텐트 전달
Intent intent = new Intent(this, IntentCallee.class);
intent.putExtra("name", "gildong");
intent.putExtra("age", 30);
startActivity(intent);
코드 인텐트 수신
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 20);
인텐트에 대한 자세한 내용은 다음 링크에서 살펴볼 수 있다. http://developer.android.com/reference/android/content/Intent.html
인텐트 필터
인텐트 필터(IntentFilter)는 특정 인텐트를 받을지 말지를 정의하는 역할을 수행하며, 이를 통해 컴포넌트의 특징이 정해진다. 예를 들어, 인텐트 필터의
코 AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.notepad">
<application android:icon="@drawable/app_notes"
android:label="@string/app_name">
<provider class=".NotePadProvider"
android:authorities="com.google.provider.NotePad" />
<activity class=".NotesList" android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
<activity class=".NoteEditor" android:label="@string/title_note">
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
</activity>
<activity class=".TitleEditor" android:label="@string/title_edit_title"
android:theme="@android:style/Theme.Dialog">
<intent-filter android:label="@string/resolve_title">
<action android:name="com.android.notepad.action.EDIT_TITLE" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
</application>
</manifest>
표준 액티비티 액션
액티비티 액션은 액티비티를 어떻게 실행할 지를 지정하는 속성이다. 이 액션들은 액티비티를 실행할 때 사용하는 startActivity(Intent) 메소드에 지정하는 인텐트 객체에 설정할 수 있다.
- ACTION_MAIN 시작 액티비티를 지정하는 액션
- ACTION_VIEW 데이터를 사용자에게 보여주는 액션
- ACTION_ATTACH_DATA 데이터가 첨부되었다는 것을 알려주는 액션
- ACTION_EDIT 데이터 수정을 요청하는 액션
- ACTION_PICK 데이터에서 원하는 것을 선택하는 액션
- ACTION_CHOOSER 액티비티 선택 화면을 보여주는 액션
- ACTION_GET_CONTENT 사용자가 선택한 데이터를 반환하는 액션
- ACTION_DIAL 전화 다이얼 액티비티를 호출하는 액션
- ACTION_CALL 전화를 거는 액션
- ACTION_SEND 데이터를 전송하는 액션
- ACTION_SENDTO 데이터를 지정된 곳에 전송하는 액션
- ACTION_ANSWER 수신중인 전화를 다루는 액션
- ACTION_INSERT 주어진 컨테이너로 아이템을 삽입하는 액션
- ACTION_DELETE 주어진 컨테이너의 데이터를 삭제하는 액션
- ACTION_RUN 데이터를 실행하는 액션
- ACTION_SYNC 데이터 동기화를 수행하는 액션
- ACTION_PICK_ACTIVITY 액티비티를 골라주는 액션
- ACTION_SEARCH 검색을 수행하는 액션
- ACTION_WEB_SEARCH 웹 검색을 수행하는 액션
- ACTION_FACTORY_TEST 공장 테스트를 나타내는 액션
표준 브로드캐스트 액션
다음은 브로드캐스트 리시버가 받을 수 있는 액션들이다. 이 액션들은 registerReceiver(BroadcastReceiver, IntentFilter) 메소드의 IntentFilter에 정의하거나 AndroidManifest.xml의
- ACTION_TIME_TICK 현재 시간이 변경되었음을 알려주는 액션
- ACTION_TIME_CHANGED 시간이 설정되었음을 알려주는 액션
- ACTION_TIMEZONE_CHANGED 시간대가 변경되었음을 알려주는 액션
- ACTION_BOOT_COMPLETED 기기 부팅이 완료되었음을 알려주는 액션
- ACTION_PACKAGE_ADDED 패키지가 추가되었음을 알려주는 액션
- ACTION_PACKAGE_CHANGED 패키지가 변경되었음을 알려주는 액션
- ACTION_PACKAGE_REMOVED 패키지가 제거되었음을 알려주는 액션
- ACTION_PACKAGE_RESTARTED 패키지가 다시 시작되었음을 알려주는 액션
- ACTION_PACKAGE_DATA_CLEARED 사용자가 패키지 데이터를 정리했음을 알려주는 액션
- ACTION_UID_REMOVED 시스템에서 사용자 아이디가 제거되었음을 알려주는 액션
- ACTION_BATTERY_CHANGED 배터리 정보가 변경되었음을 알려주는 액션
- ACTION_POWER_CONNECTED 외부 전원이 연결되었음을 알려주는 액션
- ACTION_POWER_DISCONNECTED 외부 전원 연결이 해지되었음을 알려주는 액션
- ACTION_SHUTDOWN 기기가 종료될 것이라는 것을 알려주는 액션
표준 카테고리
카테고리는 인텐트 대상에 대한 분류 정보를 지정하는 속성이다. addCategory(String) 메소드로 추가할 수 있으며 카테고리를 지정하여 원하는 대상을 명확히 지정할 수 있다.
- CATEGORY_DEFAULT 가장 기본이 되는 액티비티
- CATEGORY_BROWSABLE 웹 브라우징을 할 수 있는 액티비티
- CATEGORY_TAB TabActivity 내에서 사용되는 탭을 지정
- CATEGORY_ALTERNATIVE 사용자가 현재 보고 있는 데이터의 대체 액션
- CATEGORY_SELECTED_ALTERNATIVE 사용자가 현재 선택한 데이터의 대체 액션
- CATEGORY_LAUNCHER 애플리케이션에서 가장 먼저 실행되는 액티비티
- CATEGORY_INFO 패키지에 대한 정보를 제공하는 액티비티를 지정
- CATEGORY_HOME 가장 처음 실행되는 액티비티를 지정
- CATEGORY_PREFERENCE 프리퍼런스 액티비티
- CATEGORY_TEST 테스트로 사용할 경우 지정
- CATEGORY_CAR_DOCK 기기가 차량용 거치대에 장착되었을 때 호출되는 액티비티를 지정
- CATEGORY_DESK_DOCK 기기가 책상용 거치대에 장착되었을 때 호출되는 액티비티를 지정
- CATEGORY_CAR_MODE 차량에서 사용할 수 있는 액티비티를 지정
표준 추가 데이터
다음은 추가 데이터로 사용할 수 있는 필드이다. putExtra(String, Bundle) 메소드와 함께 사용된다.
- EXTRA_ALARM_COUNT AlarmManager가 사용하는 알람 개수
- EXTRA_BCC 이메일의 숨은 참조 리스트
- EXTRA_CC 이메일의 참조 리스트
- EXTRA_DATA_REMOVED 데이터 전부 제거인지 아닌지를 알려주는 불린 값(ACTION_PACKAGE_REMOVED에서 사용)
- EXTRA_DOCK_STATE 거치대 상태를 요청할 때 사용하는 데이터(ACTION_DOCK_EVENT에서 사용)
- EXTRA_DOCK_STATE_HE_DESK 거치대가 디지털인지를 알려주는 숫자 값
- EXTRA_DOCK_STATE_LE_DESK 거치대가 아날로그인지를 알려주는 숫자 값
- EXTRA_DOCK_STATE_CAR 거치대가 차량용인지를 알려주는 숫자 값
- EXTRA_DOCK_STATE_DESK 거치대가 책상용인지를 알려주는 숫자 값
- EXTRA_DOCK_STATE_UNDOCKED 기기가 거치대에 없다는 것을 알려주는 숫자 값
- EXTRA_DONT_KILL_APP 애플리케이션을 재시작하는 기본 액션을 재정의하기 위해 ACTION_PACKAGE_REMOVED나 ACTION_PACKAGE_CHANGED에서 사용하는 여분의 불린 값
- EXTRA_EMAIL 전송할 이메일 주소
- EXTRA_INITIAL_INTENTS ACTION_CHOOSER에 의해 보여질 인텐트들
- EXTRA_INTENT ACTION_PICK_ACTIVITY에 사용할 인텐트 정보
- EXTRA_KEY_EVENT 인텐트에 의해 호출될 이벤트 정보를 나타내는 KeyEvent 객체
- EXTRA_PHONE_NUMBER 전화 액션 관련해 저장할 전화번호
- EXTRA_REMOTE_INTENT_TOKEN 원격 인텐트에 사용할 추가 정보
- EXTRA_REPLACING 패키지가 교체를 알리기 위해 ACTION_PACKAGE_REMOVED에 사용하는 불린 값
- EXTRA_SHORTCUT_ICON 단축 아이콘에 사용할 Bitmap 이름
- EXTRA_SHORTCUT_ICON_RESOURCE 단축 아이콘에 사용할 리소스 이름
- EXTRA_SHORTCUT_INTENT 단축 아이콘을 나타내는 이름
- EXTRA_STREAM ACTION_SEND와 함께 사용될 수 있는 스트림
- EXTRA_SHORTCUT_NAME 단축 아이콘 이름을 정의하는 이름
- EXTRA_SUBJECT 메시지 제목
- EXTRA_TEMPLATE ACTION_INSERT와 함께 사용되는 초기 데이터
- EXTRA_TEXT ACTION_SEND와 함께 사용되는 문자열
- EXTRA_TITLE ACTION_CHOOSER에 의해 사용되는 다이얼로그 제목
- EXTRA_UID ACTION_UID_REMOVED와 함께 사용되는 패키지의 아이디
플래그
인텐트에 사용할 수 있는 플래그(Flags)이다. 인텐트에 플래그를 설정해서 특정 정보를 전달할 수 있으며 대부분의 플래그는 액티비티의 동작 방식을 변경하는 용도로 쓰인다. setFlags(int)와 addFlags(int) 메소드가 함께 사용된다.
- FLAG_GRANT_READ_URI_PERMISSION URI 읽기 권한 플래그
- FLAG_GRANT_WRITE_URI_PERMISSION URI 쓰기 권한 플래그
- FLAG_DEBUG_LOG_RESOLUTION 디버깅 정보를 로그로 출력해주는 플래그
- FLAG_FROM_BACKGROUND 백그라운드 동작임을 알려주는 플래그
- FLAG_ACTIVITY_BROUGHT_TO_FRONT 태스크에 있는 액티비티가 다시 실행되었을 때 시스템이 설정하는 플래그
- FLAG_ACTIVITY_CLEAR_TASK 태스크를 초기화하는 플래그
- FLAG_ACTIVITY_CLEAR_TOP 실행할 액티비티가 태스크에 이미 있다면 태스크에 있는 동일한 액티비티부터 최상단의 액티비티까지 모두 제거하고 새로운 액티비티를 실행하는 플래그
- FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 태스크가 재시작할 때, 액티비티를 종료할 수 있도록 액티비티에 표시를 하는 플래그
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS "최근 실행 액티비티 목록"에 보이지 않도록 하는 플래그
- FLAG_ACTIVITY_FORWARD_RESULT 액티비티 처리 결과를 전달할 수 있는 플래그
- FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY "최근 실행 액티비티 목록"에서 실행될 경우 시스템에 의해 설정되는 플래그
- FLAG_ACTIVITY_MULTIPLE_TASK 액티비티를 항상 새로운 태스크에서 실행하는 플래그
- FLAG_ACTIVITY_NEW_TASK 실행한 액티비티와 관련된 태스크가 존재하면 동일한 태스크 내에서 실행하고 그렇지 않으면 새로운 태스크에서 액티비티를 실행하는 플래그
- FLAG_ACTIVITY_NO_ANIMATION 액티비티 전환시 애니메이션을 사용하지 않게 하는 플래그
- FLAG_ACTIVITY_NO_HISTORY 실행된 액티비티를 태스크 스택에서 관리하지 않도록 해주는 플래그
- FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 사용자가 홈 스크린이나 "최근 실행 액티비티 목록"에서 태스크를 시작할 경우 시스템에 의해 설정되는 플래그
- FLAG_ACTIVITY_REORDER_TO_FRONT 실행된 액티비티가 태스크에 이미 존재하는 액티비티라면 새로 실행하지 않고 태스크에 있는 액티비티를 스택 최상단으로 옮기는 플래그
- FLAG_ACTIVITY_SINGLE_TOP 실행할 액티비티가 태스크 스택 최상단에 이미 있다면 액티비티를 다시 실행하지 않는 플래그
- FLAG_ACTIVITY_CLEAR_TASK 태스크를 초기화하는 플래그
- FLAG_RECEIVER_REGISTERED_ONLY 등록된 리시버만 브로드캐스트를 받을 수 있게 해주는 플래그
인텐트, 그 중에서도 플래그를 제대로 이해하기 위해서는 안드로이드 개발에 어느 정도 익숙해져야 한다. 그러므로 지금은 이런 것이 있구나 정도로 이해하고 향후 다시 살펴보는 것이 좋을 듯 하다. 인텐트 플래그는 대부분 액티비티와 관련된 것이 많다. 이에 대한 자세한 설명은 "제5부 안드로이드 활용 - 인텐트 활용하기"에서 살펴보도록 하겠다. 그리고 액티비티와 관련된 태스크(Task)와 백스택(BackStack)에 대해서도 알 필요가 있으므로 "제4부 안드로이드 기초 - 액티비티"도 함께 살펴보기 바란다.