[Android] Intent

Android 2010. 3. 25. 20:39
Activating components: intents

Content providers are activated when they're targeted by a request from a ContentResolver. The other three components activities, services, and broadcast receivers are activated by asynchronous messages called intents. An intent is an Intent object that holds the content of the message. For activities and services, it names the action being requested and specifies the URI of the data to act on, among other things. For example, it might convey a request for an activity to present an image to the user or let the user edit some text. For broadcast receivers, the Intent object names the action being announced. For example, it might announce to interested parties that the camera button has been pressed. 




컨텐트 프로바이더content provider는 컨텐트 리졸버content resolver 요청의 대상target이 될 때 활성화된다. 하지만 다른 세 가지 컴포넌트, 즉 액티비티, 서비스, 그리고 브로드캐스트 리시버는 인텐트intent라 불리는 비동기적인 메시지에 의해 활성화된다. 인텐트는 컨텐트 메시지를 보유하고 있는 인텐트Intent 오브젝트다. 인텐트는 액티비티와 서비스에 대해서, 그것에게 요청되는requested 액션을 가리키고 그 액션이 처리해야 하는 데이터의 URI를 나머지 다른 것들과 함께 명시한다. 예를 들어 인텐트는 어떤 액티비티가 사용자에게 이미지를 보여주도록 하거나, 또는 사용자가 어떤 텍스트를 편집할 수 있도록 하는 요청을 전달할 수 있다. 인텐트 오브젝트는 브로드캐스트 리시버에 대해서는, 공지되는announced 액션을 가리킨다. 예를 들어 그것은 카메라 버튼이 눌려졌다는 사실에 관심을 갖는 관계자party에게 공지될 수 있다.


[출처] 안드로이드 개발자 가이드



애플리캐이션은 하나 이상의 액티비티로 이루어질 수 있다. 실제로 여러개의 액티비티, 서비스가 서로 연결되어 하나의 애플리캐이션을 구성하는 경우가 대부분일 것이다.

안드로이드에서는 인텐트 객체를 이용하여 다른 컴포넌트를 호출할 수 있다. 즉 인텐트는 어떤 행위를 뜻하는 의미로 해석될 수도 있다. 인텐트 객체는 안드로이드 어플리케이션 내의 컴포넌트를 호출하기 위한 여러 정보들을 담고 있으며, 이 정보들에는 호출 대상 컴포넌트의 이름이 명시되어 있을 수도 있고, 혹은 호출 대상 컴포넌트의 특성만 나열되어 있을 수도 있다. 또한, 어플리케이션 호출 외에도 호출된 액티비티가 자신을 호출한 액티비티에게 결과값 등을 전달할 때에도 인텐트 객체에 데이터를 담아 전달한다. 이런 경우는 인텐트 객체가 마치 물건을 전달해주는 역할을 하기도 한다.



1. 명시적 인텐트 (Explicit Intent)

API
public Intent (Context packageContext, Class<?> cls)

packageContext : 현재 컴포넌트를 포함하는 컨텍스트 객체
cls : 호출할 컴포넌트의 클래스



 

Intent intent = new Intent(this, TargetActivity.class);


인텐트 객체 생성자의 첫번째 인자는 호출하는 컴포넌트의 컨텍스트 객체를 의미하며, getApplicationContext() 메소드를 통해 어플리케이션의 컨텍스트를 넘겨주는 것도 가능하다. 이렇게 인텐트를 생성한 후, startActivity() 혹은 startService() 등의 메소드를 호출하여 호출하려는 컴포넌트의 유형에 맞게끔 인텐트를 넘겨주면 해당 컴포넌트를 호출할 수 있다.


// 인텐트 객체 생성
Intent intent = new Intent(this, SubActivity.class);

// 액티비티 실행
startActivity(intent);

//결과값을 받기 위한 액티비티 실행
int REQUEST_CODE = 1; // 결과값을 요구하는 여러 상황을 호출 대상 액티비티에서 알게끔 합니다.

startActivityForResult(intent, REQUEST_CODE); // 액티비티 호출


 


2. 암시적 인텐트 (Implicit Intent)


암시적 인텐트는 호출할 컴포넌트를 정확히 아는 것이 아니라 인텐트 객체 내에 호출 대상 컴포넌트를 찾을 수 있는
정보들만 들어있다. 인텐트 객체 내의 이러한 정보들은 호출 대상 컴포넌트가 action, category(어떤 작업을처리할
수 있는지),  data(어떤 유형의 데이터를 처리할 수 있는지) 그리고 type[mimeType](처리할 데이터가 있는 주소)를
주로 담고 있다.
애플리케이션이 구동될 때 처음으로 실행되는 액티비티는 메니페스트 파일의 인텐트 필터에 아래와 같이 정의되어 있다.


<activity android:name=".LifeCycleTester" android:label="@string/app_name">
 <intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <catgory android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
</activity>


인텐트 필터는 자신이 원하는 인텐트를 골라낼 때 필요한 정보들을 정의해놓은 것으로,암시적 인텐트의 인텐트 해석(Intent Resolving) 과정에 꼭 필요한 요소이다.

사용예)

//인텐트 객체에 type 속성(전화번호부 데이터를 받기 위한)을 추가
Intent intent = new Intent();
intent.setType("vnd.android.cursor.item/phone");

Intent i = new Intent();
i.putExtra("HELLO", "Hello Android");

// 인텐트를 받은 다른 컴포넌트가 Extras 데이터를 받아온다.
String str = getIntent().getExtras().getString("HELLO");


Posted by finewoo
,