| 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 <activity>}</a> |
| 요소에 상응하는 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</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 <action>}</a> 요소를 사용하여 인텐트 필터에 지정합니다. |
| 이 요소에 지정하는 값은 API 상수 대신 |
| 작업의 전체 문자열 이름이어야 합니다(다음 예제 참조).</p></dd> |
| |
| <dt>데이터</dt> |
| <dd>인텐트와 관련된 데이터에 대한 설명입니다. |
| <p><a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</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 <category>}</a> 요소를 사용하여 인텐트 필터에 |
| 지정합니다.</p></dd> |
| </dl> |
| |
| <p>인텐트 필터에서 액티비티가 허용하는 기준을 선언할 수 있습니다. |
| 이는 이러한 기준 각각을 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a> 요소 내에 해당 XML 요소를 중첩하여 선언하면 |
| 가능합니다.</p> |
| |
| <p>예를 들어, 다음은 데이터 유형이 텍스트 또는 이미지인 경우 {@link |
| android.content.Intent#ACTION_SEND} 인텐트를 처리하는 인텐트 필터가 지정된 액티비티입니다.</p> |
| |
| <pre> |
| <activity android:name="ShareActivity"> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:mimeType="text/plain"/> |
| <data android:mimeType="image/*"/> |
| </intent-filter> |
| </activity> |
| </pre> |
| |
| <p>수신되는 인텐트는 각각 하나의 작업 및 하나의 데이터 유형만 지정합니다. 하지만 |
| <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code |
| <intent-filter>}</a> 각각에 <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code |
| <action>}</a>, <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code |
| <category>}</a> 및 <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code |
| <data>}</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> |
| <activity android:name="ShareActivity"> |
| <!-- filter for sending text; accepts SENDTO action with sms URI schemes --> |
| <intent-filter> |
| <action android:name="android.intent.action.SENDTO"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:scheme="sms" /> |
| <data android:scheme="smsto" /> |
| </intent-filter> |
| <!-- filter for sending text or images; accepts SEND action and text or image data --> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:mimeType="image/*"/> |
| <data android:mimeType="text/plain"/> |
| </intent-filter> |
| </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> |
| @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> |
| |
| |
| |
| |
| |
| |