blob: 265534c709634b5f998cda50167b832fa7685d8f [file] [log] [blame]
page.title=다른 앱이 자신의 액티비티를 시작하도록 허용하기
page.tags=intents
helpoutsWidget=true
trainingnavtop=true
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2> 과정에서 다루는 내용</h2>
<ol>
<li><a href="#AddIntentFilter">인텐트 필터 추가하기</a></li>
<li><a href="#HandleIntent">액티비티에서 인텐트 처리하기</a></li>
<li><a href="#ReturnResult">결과 반환하기</a></li>
</ol>
<h2>필독 항목</h2>
<ul>
<li><a href="{@docRoot}training/sharing/index.html">간단한 데이터 공유하기</a></li>
<li><a href="{@docRoot}training/secure-file-sharing/index.html">파일 공유하기</a>
</ul>
</div>
</div>
<p>앞의 과정은 이야기의 면인 자신의 앱에서
다른 앱의 액티비티를 시작하는 것에 초점을 뒀습니다. 그러나 자신의 앱이 다른 앱에 유용할 있는 작업을 수행할 있는 경우
다른 앱의 작업 요청에 응답할 있도록 준비되어 있어야 합니다. 예를 들어, 사용자가
친구와 메시지 또는 사진을 공유할 있는 소셜 앱을 만드는 경우 사용자가 다른 앱에서
"공유" 작업을 시작하고 작업을 수행하기 위해 여러분 자신의 앱을 시작할 있도록
{@link android.content.Intent#ACTION_SEND} 인텐트를 지원하는 것이 좋습니다.</p>
<p>다른 앱이 자신의 액티비티를 시작할 있도록 하기 위해서는 <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
요소에 상응하는 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code &lt;intent-filter&gt;}</a> 요소를 매니페스트 파일에 추가해야 합니다.</p>
<p>앱이 기기에 설치되면 시스템이 인텐트
필터를 식별한 설치된 모든 앱에서 지원되는 인텐트의 내부 카탈로그에 해당 정보를 추가합니다.
앱이 암묵적인 인텐트를 사용하여 {@link android.app.Activity#startActivity
startActivity()} 또는 {@link android.app.Activity#startActivityForResult startActivityForResult()}를
호출하면 시스템이 인텐트에 응답 가능한 액티비티(또는 여러 액티비티)를
찾습니다.</p>
<h2 id="AddIntentFilter">인텐트 필터 추가하기</h2>
<p>액티비티가 처리 가능한 인텐트를 올바르게 정의하려면 액티비티가
받아들이는 데이터와 작업 유형 측면에서
추가하는 인텐트 필터가 최대한 구체적이어야 합니다.</p>
<p>액티비티의 인텐트 필터가 {@link android.content.Intent} 개체의 다음 기준을 충족할
경우, 시스템이 주어진 {@link android.content.Intent}를 해당 액티비티에 보낼 있습니다.</p>
<dl>
<dt>작업</dt>
<dd>수행할 작업의 이름을 지정하는 문자열입니다. 일반적으로, 플랫폼에서 정의하는
하나입니다(예: {@link android.content.Intent#ACTION_SEND} 또는 {@link android.content.Intent#ACTION_VIEW}).
<p><a href="{@docRoot}guide/topics/manifest/action-element.html">{@code &lt;action&gt;}</a> 요소를 사용하여 인텐트 필터에 지정합니다.
요소에 지정하는 값은 API 상수 대신
작업의 전체 문자열 이름이어야 합니다(다음 예제 참조).</p></dd>
<dt>데이터</dt>
<dd>인텐트와 관련된 데이터에 대한 설명입니다.
<p><a href="{@docRoot}guide/topics/manifest/data-element.html">{@code &lt;data&gt;}</a> 요소를 사용하여 인텐트 필터에 지정합니다. 요소에서
하나 이상의 특성을 사용하여 MIME 유형, URI 접두사, URI 스키마, 또는
이들의 조합 그리고 수락된 데이터 유형을 나타내는 다른 요소들을 지정할
있습니다.</p>
<p class="note"><strong>참고:</strong> 액티비티가 URI 아닌
다른 종류의 "엑스트라" 데이터를 처리할 때와 같이, 데이터
{@link android.net.Uri}에 대한 세부사항을 선언할 필요가 없는 경우, {@code text/plain} 또는 {@code image/jpeg}와 같이 액티비티가 처리하는 데이터
유형을 선언하는 {@code android:mimeType} 특성만 지정하면 됩니다.</p>
</dd>
<dt>카테고리</dt>
<dd>인텐트를 처리하는 액티비티의 특징을 지정할 있는 추가적인 방법을 제공합니다. 일반적으로, 사용자 제스처 또는 이러한 제스처가 시작된 위치와
관련되어 있습니다. 시스템이 지원하는 카테고리는
여러 가지가 있지만 대부분은 거의 사용되지 않습니다. 하지만 모든 암묵적인 인텐트는 기본적으로
{@link android.content.Intent#CATEGORY_DEFAULT}로 정의됩니다.
<p><a href="{@docRoot}guide/topics/manifest/category-element.html">{@code &lt;category&gt;}</a> 요소를 사용하여 인텐트 필터에
지정합니다.</p></dd>
</dl>
<p>인텐트 필터에서 액티비티가 허용하는 기준을 선언할 있습니다.
이는 이러한 기준 각각을 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code &lt;intent-filter&gt;}</a> 요소 내에 해당 XML 요소를 중첩하여 선언하면
가능합니다.</p>
<p>예를 들어, 다음은 데이터 유형이 텍스트 또는 이미지인 경우 {@link
android.content.Intent#ACTION_SEND} 인텐트를 처리하는 인텐트 필터가 지정된 액티비티입니다.</p>
<pre>
&lt;activity android:name="ShareActivity">
&lt;intent-filter>
&lt;action android:name="android.intent.action.SEND"/>
&lt;category android:name="android.intent.category.DEFAULT"/>
&lt;data android:mimeType="text/plain"/>
&lt;data android:mimeType="image/*"/>
&lt;/intent-filter>
&lt;/activity>
</pre>
<p>수신되는 인텐트는 각각 하나의 작업 하나의 데이터 유형만 지정합니다. 하지만
<a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a> 각각에 <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code
&lt;action&gt;}</a>, <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code
&lt;category&gt;}</a> 및 <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code
&lt;data&gt;}</a>에 대한 여러
인스턴스를 선언해도 문제가 되지는 않습니다.</p>
<p>작업 및 데이터의 두 쌍이 상호 배타적으로
동작할 경우, 어떤 데이터 유형과 페어링되었을 때 어떤 작업이 허용 가능한지를 지정하는
인텐트 필터를 각각 따로 생성해야 합니다.</p>
<p>예를 들어 액티비티가 {@link
android.content.Intent#ACTION_SEND} 및 {@link
android.content.Intent#ACTION_SENDTO} 인텐트 모두에서 텍스트와 이미지 모두를 처리한다고 가정합니다. 이런 경우, 두 작업 각각에 별도의
인텐트 필터를 정의해야 합니다. 그 이유는 {@link
android.content.Intent#ACTION_SENDTO} 인텐트는 데이터 {@link android.net.Uri}를 사용해서 {@code send} 또는 {@code sendto} URI 스키마를 사용하는
수신자 주소를 지정해야 하기 때문입니다. 예를 들면 다음과 같습니다.</p>
<pre>
&lt;activity android:name="ShareActivity">
&lt;!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
&lt;intent-filter>
&lt;action android:name="android.intent.action.SENDTO"/>
&lt;category android:name="android.intent.category.DEFAULT"/>
&lt;data android:scheme="sms" />
&lt;data android:scheme="smsto" />
&lt;/intent-filter>
&lt;!-- filter for sending text or images; accepts SEND action and text or image data -->
&lt;intent-filter>
&lt;action android:name="android.intent.action.SEND"/>
&lt;category android:name="android.intent.category.DEFAULT"/>
&lt;data android:mimeType="image/*"/>
&lt;data android:mimeType="text/plain"/>
&lt;/intent-filter>
&lt;/activity>
</pre>
<p class="note"><strong>참고:</strong> 암묵적인 인텐트를 수신하기 위해서는
{@link android.content.Intent#CATEGORY_DEFAULT} 카테고리를 인텐트 필터에 포함해야 합니다. {@link
android.app.Activity#startActivity startActivity()} 및 {@link
android.app.Activity#startActivityForResult startActivityForResult()} 메서드는 {@link android.content.Intent#CATEGORY_DEFAULT} 카테고리를
선언한 것으로 모든 인텐트를 간주합니다. 인텐트 필터에서 이 카테고리를
선언하지 않으면 어떠한 암묵적인 인텐트도 액티비티로 확인되지 않습니다.</p>
<p>소셜 공유 동작을 수행하는 {@link android.content.Intent#ACTION_SEND}
인텐트의 송수신에 대한 자세한 내용은 <a href="{@docRoot}training/sharing/receive.html">다른 앱에서 간단한 데이터 수신하기</a> 과정을 참조하세요.</p>
<h2 id="HandleIntent">액티비티에서 인텐트 처리하기</h2>
<p>액티비티를 시작하는 데 사용된 {@link
android.content.Intent}를 읽어 액티비티에서 취할 작업을 결정할 수 있습니다.</p>
<p>액티비티가 시작되면, {@link android.app.Activity#getIntent()}를 호출하여
액티비티를 시작한 {@link android.content.Intent}를 검색합니다. 이 작업은 액티비티의
수명 주기 동안 언제든지 가능하지만, 일반적으로
{@link android.app.Activity#onCreate onCreate()} 또는 {@link android.app.Activity#onStart()}와 같은 초기 콜백 과정에서 수행합니다.</p>
<p>예를 들면 다음과 같습니다.</p>
<pre>
&#64;Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}
</pre>
<h2 id="ReturnResult">결과 반환하기</h2>
<p>액티비티를 호출한 액티비티로 결과를 반환하고자 하는 경우, 간단하게 {@link
android.app.Activity#setResult(int,Intent) setResult()}를 호출하여 결과 코드 및 결과 {@link
android.content.Intent}를 지정하면 됩니다. 작업이 끝나고 사용자가 원래
액티비티로 되돌아갈 경우, {@link android.app.Activity#finish()}를 호출하여 액티비티를 종료(및 소멸)합니다. 예를 들면
다음과 같습니다.</p>
<pre>
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();
</pre>
<p>결과 코드는 항상 결과와 함께 지정해야 합니다. 일반적으로 {@link
android.app.Activity#RESULT_OK} 또는 {@link android.app.Activity#RESULT_CANCELED}입니다. 그런 다음 필요한 경우 {@link android.content.Intent}를 사용하여 추가 데이터를
제공할 수 있습니다.</p>
<p class="note"><strong>참고:</strong> 결과는 기본적으로 {@link
android.app.Activity#RESULT_CANCELED}로 설정됩니다. 따라서 작업을 완료하기 전과
개발자가 결과를 설정하기 전에 사용자가 <em>뒤로</em> 버튼을 누를 경우, 원래의 액티비티는
"취소" 결과를 받게 됩니다.</p>
<p>단순히 여러 가지 결과 옵션 중 하나를 나타내는 정수만 반환하면 되는 경우,
결과 코드를 0보다 큰 임의의 값으로 설정하면 됩니다. 결과 코드를 사용하여 정수만 제공하고
{@link android.content.Intent}를 포함할 필요는 없는 경우, {@link
android.app.Activity#setResult(int) setResult()}를 호출하고 결과 코드만 전달하면 됩니다. 예를 들면 다음과 같습니다.</p>
<pre>
setResult(RESULT_COLOR_RED);
finish();
</pre>
<p>이런 경우, 가능한 결과는 몇 개에 불과할 것이므로 결과 코드는 로컬로
정의된 정수입니다(0보다 큼). 이는 자신의 앱에서 액티비티에 결과를 반환할 때
유용합니다. 왜냐하면 결과를 수신한 액티비티가 공용 상수를 참조하여 결과 코드의
값을 확인할 수 있기 때문입니다.</p>
<p class="note"><strong>참고:</strong> {@link android.app.Activity#startActivity startActivity()}
또는 {@link
android.app.Activity#startActivityForResult startActivityForResult()}로 액티비티가
시작되었는지 확인할 필요는 없습니다. 액티비티를 시작한
인텐트가 결과를 원할 경우, {@link android.app.Activity#setResult(int,Intent) setResult()}를
호출하기만 하면 됩니다. 원래의 액티비티가 {@link
android.app.Activity#startActivityForResult startActivityForResult()}를 호출한 경우, 시스템은 개발자가 {@link android.app.Activity#setResult(int,Intent) setResult()}에 제공하는
결과를 액티비티에 제공합니다. 그렇지 않을 경우
결과는 무시됩니다.</p>