본문 바로가기
개발/안드로이드

Intent Action, Category, example, etc...

by darksilber 2012. 2. 6.
반응형
출처 - http://www.mfamstory.com/

인텐트는 액티비티(activity), 서비스(service), 브로드캐스트(broadcast receiver)를 실행하게끔 하는 비동기 메시지를 말한다. 인텐트는 실제로는 Intent 객체를 나타내며 아래와 같은 요소로 구성 된다.

인텐트 요소

내용

Component name

인텐트, 옵션(보통 액션으로부터 유추 할 수 있는), 타입, 그리고 카테고리를 사용하기 위한 명시적 패키지와 클래스 지정

Action

액션을 가리키는 공인된 문자열

Data

URI 형태로 표현되는 작업을 위한 데이터

Category

인텐트에 대한 추가 메타 데이터

Extras

추가 데이터를 번들 형태의 인텐트로 전달

Flags

Activity를 실행시키고 다루는것에 대한 다양한 종류의 플래그

인텐트는 두 그룹으로 나눌 수 있다. 하나는 명시적 인텐트(Explicit Intent)이고 다른 하나는 묵시적 인텐트(Implicit Intent)이다. 명시적 인텐트는 이름을 통해 타겟 컴포넌트를 지정하는 방식이다. 묵시적 인텐트는 타겟 컴포터넌트의 지정 없이 플랫폼에서 컴포넌트를 결정한다. 이때는 인텐트의 액션(action), 데이터(data), 카테고리(category)를 사용하여 결정하며 이를 인텐트 레졸루션(Intent resolution)이라고 한다.

액티비티, 서비스, 브로드캐스트 리시버는 자신들이 어떤 묵시적 인텐트를 다룰 수 있는지 시스템에 알리기 위해 하나 이상의 인텐트 필터(Intent Filter)를 가질 수 있다. 각 인텐트 필터는 해당 컴포넌트에서 받을 수 있는 인텐트들의 집합을 묘사한다.

======================================================================================================================================

스마트폰 OS인 Android에서 Intent 관련 사항을 정리 한다.

목차

[숨기기]
if (window.showTocToggle) { var tocShowText = "보이기"; var tocHideText = "숨기기"; showTocToggle(); }

Intent 개요

  • Intent 정의
원하는 실제 행동을 호출할 때 사용하는 객체
애플리케이션에서 다른 모듈의 기능을 호출할 때 사용하는 객체
Intent 핸들러(Activity, Service, BroadcastReceiver)에 의해서 처리됨
public class android.content.Intent implements Parcelable

Android Intent

  • 구성
Component가 Data와 Type로 지정된 대상에 대해 Category와 Action으로 지정된 행위를 한다. 추가적인 정보는 Extras로 제공 한다.

Category
  • 인텐트의 분류로 여러 값을 가질 수 있음
  • Category가 있고 Action이 없을 경우 모든 Action이 매핑됨
CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE";
CATEGORY_TAB = "android.intent.category.TAB";
CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";
CATEGORY_INFO = "android.intent.category.INFO";
CATEGORY_HOME = "android.intent.category.HOME";
CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE";
CATEGORY_EMBED = "android.intent.category.EMBED";
CATEGORY_MONKEY = "android.intent.category.MONKEY";
CATEGORY_TEST = "android.intent.category.TEST";
CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";
CATEGORY_OPENABLE = "android.intent.category.OPENABLE";
CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST = "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST";
CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK";
CATEGORY_DESK_DOCK = "android.intent.category.DESK_DOCK";
Action
  • 인텐트의 액션
  • Category가 없고 Action이 있을 경우, Category가 없는 Action만 매핑됨
ACTION_MAIN = "android.intent.action.MAIN";
ACTION_VIEW = "android.intent.action.VIEW";
ACTION_DEFAULT = "android.intent.action.VIEW";
ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
ACTION_EDIT = "android.intent.action.EDIT";
ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
ACTION_PICK = "android.intent.action.PICK";
ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
ACTION_CHOOSER = "android.intent.action.CHOOSER";
ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
ACTION_DIAL = "android.intent.action.DIAL";
ACTION_CALL = "android.intent.action.CALL";
ACTION_SENDTO = "android.intent.action.SENDTO";
ACTION_SEND = "android.intent.action.SEND";
ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE";
ACTION_ANSWER = "android.intent.action.ANSWER";
ACTION_INSERT = "android.intent.action.INSERT";
ACTION_DELETE = "android.intent.action.DELETE";
ACTION_RUN = "android.intent.action.RUN";
ACTION_SYNC = "android.intent.action.SYNC";
ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
ACTION_SEARCH = "android.intent.action.SEARCH";
ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT";
ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED";
ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE";
ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED";
ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED";
ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED";
ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
ACTION_REBOOT = "android.intent.action.REBOOT";
ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
Data
  • 작업 요청 URI
  • 종류 1 : scheme, authority, path
  • 예) weather://com.msi.manning/loc?zip=12345
  • 종류 2 : MIME 형식, Content Provider와 연계됨
  • 예) content://com.google.provider.NotePad/notes
  • Scheme가 있고 Type이 없으면, 모든 Type이 매핑됨
  • Scheme가 없고 Type이 있으면, 모든 Scheme가 매핑됨
  • Scheme가 없고 Type이 없으면, 매핑되지 않음
Type
  • MIME 타입
Component
  • 실제 작업을 실행할 Class
new ComponentName(Package_Name, Class_Name)
Extras
  • 추가 데이터, Bundle
Intent result = new Intent();
result.putExtra(LoginActivity.TEXT_RESULT, "finish");

String result = data.getStringExtra(TEXT_RESULT);

  • 인텐트 선언
  • 명시적 선언 : new Intent(Context packageContext, Class cls)
  • 묵시적 선언 : new Intent(String action, Uri uri)
  • 인텐트 핸들러

Activity
  • android.content.Context.startActivity(Intent intent)
  • startActivityForResult(Intent, requestCode)
Service
  • android.content.Context.startService(Intent intent)
  • android.content.Context.bindService(Intent intent, ServiceConnection serviceconnection, int i)
BroadcastReceiver
  • android.content.Context.sendBroadcast(Intent intent)
  • android.content.Context.sendStickyBroadcast(Intent intent)
  • android.content.Context.sendOrderedBroadcast(Intent intent, String receiverPermission)
  • android.content.BroadcastReceiver.onReceive(Context context, Intent intent)

  • IntentFilter
  • AndroidManifest.xml
Intent intent = new Intent(Constants.INTENT_ACTION_VIEW_LIST);
startActivity(intent);

<activity android:name="ReviewList"> 또는 <service> 또는 <receiver>
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <action   android:name="com.msi.manning.restaurant.VIEW_LIST" />
        <data     android:scheme="weather" android:host="com.msi.manning" />
    </intent-filter>
</activity>

Intent 활용 사례

연락처 Intent

  • 연락처 조회
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);
  • 연락처 등록
intent = new Intent(Intent.ACTION_INSERT, Uri.parse("content://contacts/people"));
startActivity(intent);
  • 연락처 수정
intent = new Intent(Intent.ACTION_EDIT, Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);
  • 연락처 삭제
intent = new Intent(Intent.ACTION_DELETE, Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

전화 Intent

  • 권한 설정 (AndroidManifest.xml)
전화 걸기         : CALL_PHONE = "android.permission.CALL_PHONE"
긴급 통화         : CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED"
폰 상태 읽기      : READ_PHONE_STATE = "android.permission.READ_PHONE_STATE"
폰 상태 수정      : MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE"
브로드케스팅 수신 : PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS"
전화 걸기 이전    : ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL"
  • 전화걸기 화면
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + TelNumber));
startActivity(intent);
  • 전화걸기
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + TelNumber));
startActivity(intent);

SMS Intent

  • 권한 설정 (AndroidManifest.xml)
수신 모니터링       : RECEIVE_SMS = "android.permission.RECEIVE_SMS"
읽기 가능           : READ_SMS = "android.permission.READ_SMS" 
발송 가능           : SEND_SMS = "android.permission.SEND_SMS"
SMS Provider로 전송 : WRITE_SMS = "android.permission.WRITE_SMS"
                    : BROADCAST_SMS = "android.permission.BROADCAST_SMS"
  • SMS 발송 화면
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);
  • SMS 보내기
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto://" + contact.getHandphone()));
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

이메일 Intent

  • 이메일 발송 화면
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + contact.getEmail()));
startActivity(intent);

브라우저 Intent

  • Browser에서 URL 호출하기
new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
startActivity(intent);
  • 브라우저에서 검색
Intent intent = new Intent(Intent.ACT ION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "검색어");
startActivity(intent);

지도 Intent

  • 지도 보기
Uri uri = Uri.parse ("geo: 38.00, -35.03");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

안드로이드 마켓 Intent

  • 안드로이드 마켓에서 Apps 검색
Uri uri = Uri.parse("market://search?q=pname:전제_패키지_명");  
//--- 예) market://search?q=pname:com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent);  
  • 안드로이드 마켓의 App 상세 화면
Uri uri = Uri.parse("market://details?id=전제_패키지_명");
//--- 예) market://details?id=com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent);

갤럭시S의 Intent

  • 패키지명과 클래스명으로 App 호출
intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("패키지명", "전체_클래스명"));
startActivity(intent);
  • 전화, SMS
  • 전화번호부 : com.android.contacts, com.sec.android.app.contacts.PhoneBookTopMenuActivity
  • 전화 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabActivity
  • 최근기록 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabDialerActivity
  • 메시지 : com.sec.mms, com.sec.mms.Mms
  • 이메일 : com.android.email, com.android.email.activity.Welcome
  • 일정 : com.android.calendar, com.android.calendar.LaunchActivity
  • 인터넷 : com.android.browser, com.android.browser.BrowserActivity
  • Google의 Android용 앱
  • 검색 : com.google.android.googlequicksearchbox, com.google.android.googlequicksearchbox.SearchActivity
  • 음성 검색 : com.google.android.voicesearch, com.google.android.voicesearch.RecognitionActivity
  • Gmail : com.google.android.gm, com.google.android.gm.ConversationListActivityGmail
  • 지도 : com.google.android.apps.maps, com.google.android.maps.MapsActivity
  • 위치찾기 : com.google.android.apps.maps, com.google.android.maps.LatitudeActivity
  • YouTube : com.google.android.youtube, com.google.android.youtube.HomeActivity
  • 토크 : com.google.android.talk, com.google.android.talk.SigningInActivity
  • Goggles : com.google.android.apps.unveil, com.google.android.apps.unveil.CaptureActivity
  • Google 번역 : com.google.android.apps.translate, com.google.android.apps.translate.HomeActivity
  • Reader : com.google.android.apps.reader, com.google.android.apps.unveil.CaptureActivity
  • Voice : com.google.android.apps.googlevoice, com.google.android.apps.googlevoice.SplashActivity
  • Google 별지도 : com.google.android.stardroid, com.google.android.stardroid.activities.SplashScreenActivity
  • 카메라 : com.sec.android.app.camera, com.sec.android.app.camera.Camera
  • TV : com.sec.android.app.dmb, com.sec.android.app.dmb.activity.DMBFullScreenView
  • Android 관리
  • 환경 설정 : com.android.settings, com.android.settings.Settings
  • 작업 관리자 : com.sec.android.app.controlpanel, com.sec.android.app.controlpanel.activity.JobManagerActivity
  • 마켓 : com.android.vending, com.android.vending.AssetBrowserActivity

기타 사례

  • Intent 사례
Intent intent = null;

new Intent(ActivityExample.this, SimpleMathService.class);

intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/~.png")), "image/png");

intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*"); // image/*, video/*, vnd.android.cursor.item/phone_v2
  • ACTION
  • VIEW, INSERT, EDIT, DELETE
  • MAIN, PICK, GET_CONTENT

참고 문헌

반응형

댓글