인텐트와 인텐트 필터 살펴보기

인텐트

인텐트(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)는 특정 인텐트를 받을지 말지를 정의하는 역할을 수행하며, 이를 통해 컴포넌트의 특징이 정해진다. 예를 들어, 인텐트 필터의 에 android.intent.action.MAIN을 선언하고 에 android.intent.category.HOME을 선언하면, 해당 컴포넌트는 홈 애플리케이션이 되어 디바이스가 시작될 때 자동으로 시작될 수 있는 애플리케이션이 된다. 인텐트 필터는 AndroidManifest.xml에 다음처럼 다양하게 정의할 수 있다(다음의 예제는 안드로이드 예제로 제공되는 노트패드 애플리케이션에 포함된 것이다). 인텐트 필터를 구성하는 요소는 인텐트에 작성할 수 있는 요소들과 동일하다.

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부 안드로이드 기초 - 액티비티"도 함께 살펴보기 바란다.

results matching ""

    No results matching ""