Skip to content

Most visited

Recently visited

navigation

다른 앱이 자신의 액티비티를 시작하도록 허용

앞의 두 과정은 자신의 앱에서 다른 앱의 액티비티를 시작하는 것에 초점을 두고 이야기의 한쪽 면만을 다뤘습니다. 그러나 자신의 앱이 다른 앱에 유용할 수 있는 작업을 수행할 수 있다면 다른 앱의 작업 요청에 응답할 수 있도록 준비되어 있어야 합니다. 예를 들어, 사용자가 친구와 메시지 또는 사진을 공유할 수 있는 소셜 앱을 빌드하는 경우 사용자가 다른 앱에서 "공유" 작업을 시작하고 이 작업을 수행하기 위해 여러분 자신의 앱을 시작할 수 있도록 ACTION_SEND 인텐트를 지원하는 것이 좋습니다.

다른 앱이 자신의 액티비티를 시작할 수 있도록 하기 위해서는 매니페스트 파일에서 해당 <activity> 요소에 대해 <intent-filter> 요소를 추가해야 합니다.

앱이 기기에 설치되면 시스템이 인텐트 필터를 식별한 후 설치된 모든 앱에서 지원되는 인텐트의 내부 카탈로그에 해당 정보를 추가합니다. 앱이 암시적 인텐트를 사용하여 startActivity() 또는 startActivityForResult()를 호출하면 시스템이 인텐트에 응답 가능한 액티비티(또는 여러 액티비티)를 찾습니다.

인텐트 필터 추가

액티비티가 처리 가능한 인텐트를 올바르게 정의하려면 액티비티가 받아들이는 데이터와 작업 유형 측면에서 추가하는 인텐트 필터가 최대한 구체적이어야 합니다.

액티비티의 인텐트 필터가 Intent 객체의 다음 기준을 충족할 경우, 시스템이 주어진 Intent를 해당 액티비티에 보낼 수 있습니다.

작업
수행할 작업의 이름을 지정하는 문자열입니다. 일반적으로, 플랫폼에서 정의하는 값 중 하나입니다(예: ACTION_SEND 또는 ACTION_VIEW).

<action> 요소를 사용하여 인텐트 필터에 지정합니다. 이 요소에 지정하는 값은 API 상수 대신 작업의 전체 문자열 이름이어야 합니다(다음 예제 참조).

데이터
인텐트와 관련된 데이터에 대한 설명입니다.

<data> 요소를 사용하여 인텐트 필터에 지정합니다. 이 요소에서 하나 이상의 특성을 사용하여 MIME 유형, URI 접두사, URI 구성표 또는 이들의 조합 그리고 수락된 데이터 유형을 나타내는 다른 요소들을 지정할 수 있습니다.

참고: 액티비티가 URI가 아닌 다른 종류의 "엑스트라" 데이터를 처리할 때와 같이 데이터 Uri에 대한 세부사항을 선언할 필요가 없는 경우, text/plain 또는 image/jpeg와 같이 액티비티가 처리하는 데이터 유형을 선언하는 데 android:mimeType 특성만 지정하면 됩니다.

카테고리
인텐트를 처리하는 액티비티의 특징을 지정할 수 있는 추가적인 방법을 제공합니다. 일반적으로, 사용자 제스처 또는 이러한 제스처가 시작된 위치와 관련되어 있습니다. 시스템이 지원하는 카테고리는 여러 가지가 있지만 대부분은 거의 사용되지 않습니다. 하지만 모든 암시적 인텐트는 기본적으로 CATEGORY_DEFAULT로 정의됩니다.

<category> 요소를 사용하여 인텐트 필터에 지정합니다.

인텐트 필터에서 액티비티가 허용하는 기준을 선언할 수 있습니다. 이는 이러한 기준 각각을 <intent-filter> 요소 내에 해당 XML 요소를 중첩하여 선언하면 가능합니다.

예를 들어, 다음은 데이터 유형이 텍스트 또는 이미지인 경우 ACTION_SEND 인텐트를 처리하는 인텐트 필터가 지정된 액티비티입니다.

<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>

수신되는 인텐트는 각각 하나의 작업 및 하나의 데이터 유형만 지정합니다. 하지만 <intent-filter> 각각에 <action>, <category><data> 요소에 대한 여러 인스턴스를 선언해도 문제가 되지는 않습니다.

작업 및 데이터의 두 쌍이 상호 배타적으로 동작할 경우, 어떤 데이터 유형과 페어링되었을 때 어떤 작업이 허용 가능한지를 지정하는 인텐트 필터를 각각 따로 생성해야 합니다.

예를 들어, 액티비티가 ACTION_SENDACTION_SENDTO 인텐트 모두에서 텍스트와 이미지 모두를 처리한다고 가정합니다. 이런 경우, 두 작업 각각에 별도의 인텐트 필터를 정의해야 합니다. 그 이유는 ACTION_SENDTO 인텐트는 데이터 Uri를 사용해서 send 또는 sendto URI 구성표를 사용하는 수신자 주소를 지정해야 하기 때문입니다. 예:

<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>

참고: 암시적 인텐트를 수신하기 위해서는 CATEGORY_DEFAULT 카테고리를 인텐트 필터에 포함해야 합니다. startActivity()startActivityForResult() 메서드는 모든 인텐트를 마치 CATEGORY_DEFAULT 카테고리를 선언한 것처럼 취급합니다. 인텐트 필터에서 이 카테고리를 선언하지 않으면 어떠한 암시적 인텐트도 액티비티로 확인되지 않습니다.

소셜 공유 동작을 수행하는 ACTION_SEND 인텐트의 송수신에 대한 자세한 내용은 다른 앱에서 단순 데이터 수신 과정을 참조하세요.

액티비티에서 인텐트 처리

액티비티를 시작하는 데 사용된 Intent를 읽어 액티비티에서 취할 작업을 결정할 수 있습니다.

액티비티가 시작되면, getIntent()를 호출하여 액티비티를 시작한 Intent를 검색합니다. 이 작업은 액티비티의 수명 주기 동안 언제든지 가능하지만, 일반적으로 onCreate() 또는 onStart()와 같은 초기 콜백 과정에서 수행합니다.

예:

@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 ...
    }
}

결과 반환

액티비티를 호출한 액티비티로 결과를 반환하고자 하는 경우, 간단하게 setResult()를 호출하여 결과 코드 및 결과 Intent를 지정하면 됩니다. 작업이 끝나고 사용자가 원래 액티비티로 되돌아갈 경우, finish()를 호출하여 액티비티를 종료(및 소멸)합니다. 예:

// 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();

결과 코드는 항상 결과와 함께 지정해야 합니다. 일반적으로 RESULT_OK 또는 RESULT_CANCELED입니다. 그런 다음 필요한 경우 Intent를 사용하여 추가 데이터를 제공할 수 있습니다.

참고: 결과는 기본적으로 RESULT_CANCELED로 설정됩니다. 따라서 작업을 완료하기 전과 개발자가 결과를 설정하기 전에 사용자가 Back 버튼을 누를 경우, 원래의 액티비티는 "취소" 결과를 받게 됩니다.

단순히 여러 가지 결과 옵션 중 하나를 나타내는 정수만 반환하면 되는 경우, 결과 코드를 0보다 큰 임의의 값으로 설정하면 됩니다. 결과 코드를 사용하여 정수만 제공하고 Intent를 포함할 필요는 없는 경우, setResult()를 호출하고 결과 코드만 전달하면 됩니다. 예:

setResult(RESULT_COLOR_RED);
finish();

이런 경우, 가능한 결과는 몇 개에 불과할 것이므로 결과 코드는 로컬로 정의된 정수입니다(0보다 큼). 이는 자신의 앱에서 액티비티에 결과를 반환할 때 유용합니다. 왜냐하면 결과를 수신한 액티비티가 공용 상수를 참조하여 결과 코드의 값을 확인할 수 있기 때문입니다.

참고: startActivity() 또는 startActivityForResult()로 액티비티가 시작되었는지 확인할 필요는 없습니다. 액티비티를 시작한 인텐트가 결과를 원할 경우, setResult()를 호출하기만 하면 됩니다. 원래의 액티비티가 startActivityForResult()를 호출한 경우, 시스템은 개발자가 setResult()에 제공하는 결과를 액티비티에 제공합니다. 그렇지 않을 경우 결과는 무시됩니다.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)