[7] 다른 앱과 연동하기 [3] 다른 앱이 우리의 액티비티를 시작하게 만들기

Allowing Other Apps to Start Your Activity

THIS LESSON TEACHES YOU TO

  1. Add an Intent Filter
  2. Handle the Intent in Your Activity
  3. Return a Result

YOU SHOULD ALSO READ


The previous two lessons focused on one side of the story: starting another app’s activity from your app. But if your app can perform an action that might be useful to another app, your app should be prepared to respond to action requests from other apps. For instance, if you build a social app that can share messages or photos with the user’s friends, it’s in your best interest to support the ACTION_SEND intent so users can initiate a “share” action from another app and launch your app to perform the action.

이전 두 레슨은 한 방향으로만 되는 것이었지요 : 우리 앱에서 다른 앱을 실행하는 것. 하지만 우리의 앱이 액션을 수행할 수 있게 할 수 있게 하려면, 다른 앱으로부터의 액션 요청에 응답할 준비가 되어 있어야 합니다. 예를 들어, 소셜 앱을 만들었다고 가정해 보겠습니다. 이 앱은 메시지나 사진을 공유할 수 있습니다. ACTION_SEND 인텐트를 지원해서, 사용자들이 “share” 액션을 다른 앱으로부터 누를 때, 우리의 앱이 수행하면 좋겠지요.

To allow other apps to start your activity, you need to add an<intent-filter> element in your manifest file for the corresponding<activity> element.

다른 앱이 우리의 액티비티를 시작하도록 하기 위해서, 우리는 <intent-filter> 엘리먼트를 매니페스트 파일에 추가해 주겠습니다. <activity> 엘리먼트에 상응하는 것입니다.

When your app is installed on a device, the system identifies your intent filters and adds the information to an internal catalog of intents supported by all installed apps. When an app callsstartActivity() or startActivityForResult(), with an implicit intent, the system finds which activity (or activities) can respond to the intent.

앱이 기기에 설치될 때, 시스템은 확인합니다. 우리의 인텐트 필터를. 그리고 그 정보를 내부적으로, 모든 설치된 앱들에 의해 지원되는 인텐트들의 카달로그가 있는데, 거기에 추가하는거죠. 우리의 앱이 startAvtivity() 나 startActivityForResult() 를 암시적인 인텐트를 통해 호출하게 되면, 시스템은 어떤 액티비티가 이 인텐트를 받아줄 수 있을 지 찾게 됩니다.

Add an Intent Filter


In order to properly define which intents your activity can handle, each intent filter you add should be as specific as possible in terms of the type of action and data the activity accepts.

어떤 인텐트들이 우리의 앱을 다룰 수 있는지 알맞게 정의하기 위해서, 우리가추가해야 할 각각의 인텐트 필터들은  최대한 상세하게 기술해야 합니다. 액션의 타입, 액티비티가 받을 데이터에 대해서 말이지요.

The system may send a given Intent to an activity if that activity has an intent filter fulfills the following criteria of the Intent object:

시스템은 아마도 주어진 인텐트를 액티비티에 보냅니다. 그 액티비티가 다음의 인텐트 오브젝트 기준을 수행하는 인텐트 필터를 갖고 있다면 말이지요.

Action
A string naming the action to perform. Usually one of the platform-defined values such as ACTION_SEND orACTION_VIEW.Specify this in your intent filter with the <action> element. The value you specify in this element must be the full string name for the action, instead of the API constant (see the examples below).
수행할 액션. 일반적으로 플래폼정의된 값 (ACTION_SEND 나 ACTION_VIEW 등). 인텐트 필터에 <action> 엘리먼트와 함께 정의하세요. 이 엘리먼트에서 명세한 값은 반드시 액션의 풀네임이어야만 합니다. API 상수 대신에(아래 예제를 보세요) 
Data
A description of the data associated with the intent. Specify this in your intent filter with the <data> element. Using one or more attributes in this element, you can specify just the MIME type, just a URI prefix, just a URI scheme, or a combination of these and others that indicate the data type accepted.
인텐트와 관련된 데이터. 이 것을 인텐트 필터에서 <data> 엘리먼트와 함께 정의하세요. 엘리먼트에서 여러 개의 속성을 쓰며, MIME 타입을 정의할 수 있습니다,  URI 접미사를 사용합니다, URI scheme, 이 것들의 조합과 ….

Note: If you don’t need to declare specifics about the data Uri (such as when your activity handles to other kind of “extra” data, instead of a URI), you should specify only the android:mimeType attribute to declare the type of data your activity handles, such as text/plain or image/jpeg.

노트 : 데이터 Uri 에 대해 스펙을 선언할 필요가 없다면(액티비티가 다른 종류의 “extra” 를 다룬다면, URI대신), android:mimeTyle 속성만 정의해 주면 됩니다. 우리의 액티비티가 다룰 데이터 타입이죠. 예를 들어 text/plain 이나 image/jpeg 같은 것들입니다

Category
Provides an additional way to characterize the activity handling the intent, usually related to the user gesture or location from which it’s started. There are several different categories supported by the system, but most are rarely used. However, all implicit intents are defined with CATEGORY_DEFAULT by default.Specify this in your intent filter with the <category> element.
인텐트를 다루는 액티비티를 특징짓는 추가적인 방법을 제공합니다. 일반적으로 유저 제스쳐나 시작된 위치에 관련되어 있습니다. 시스템으로부터 지원되는 여러 다른 종류들이 있습니다. 하지만 대부분은 쓰여지지는 않습니다. 하지만, 모든 암시적인 인텐트들은 CATEGORY_DEFAULT가 기본 값으로 정의되어 있습니다. 이 것을 우리의 인텐트 필터에 <category> 엘리먼트와 함께 정의하세요 

In your intent filter, you can declare which criteria your activity accepts by declaring each of them with corresponding XML elements nested in the <intent-filter> element.

해석 잘 안됨

For example, here’s an activity with an intent filter that handles the ACTION_SEND intent when the data type is either text or an image:

예를 들어, 액티비티가 있습니다. 이 액티비티는 인텐트 필터를 갖고 있지요. ACTION_SEND 인텐트를 다룹니다. 데이터 타입이 text 나 image 일 때 말이지요.

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

Each incoming intent specifies only one action and one data type, but it’s OK to declare multiple instances of the<action>, <category>, and <data> elements in each <intent-filter>.

각각의 들어오는 인텐트는 단 한개의 액션을 정의합니다 그리고 한 개의 데이터 타입을 정의합니다. 하지만 여러개의 인스턴스를 선언하는 것도 괜찮습니다. <action>, <category>, <data> 엘리먼트를 <intent-filter> 안에서 말이지요.

If any two pairs of action and data are mutually exclusive in their behaviors, you should create separate intent filters to specify which actions are acceptable when paired with which data types.

액션과 데이터의 쌍은 상호간에 독점적이라면, 우리는 분리된 인텐 필터를 만들어야 합니다. 그래서 어떤 액션을 받을 수 있는지 정해야 하지요.

For example, suppose your activity handles both text and images for both the ACTION_SEND andACTION_SENDTO intents. In this case, you must define two separate intent filters for the two actions because aACTION_SENDTO intent must use the data Uri to specify the recipient’s address using the send or sendto URI scheme. For example:

예를 들어, 액티비티가 text 와 image 를 둘 다 다룰 수 있다고 가정해 보겠습니다.

스탑 . 더 이상 진행을 못하겠습니다. 잘 모르겠어요

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

Note: In order to receive implicit intents, you must include the CATEGORY_DEFAULT category in the intent filter. The methods startActivity() and startActivityForResult() treat all intents as if they declared theCATEGORY_DEFAULT category. If you do not declare it in your intent filter, no implicit intents will resolve to your activity.

For more information about sending and receiving ACTION_SEND intents that perform social sharing behaviors, see the lesson about Receiving Simple Data from Other Apps.

Handle the Intent in Your Activity


In order to decide what action to take in your activity, you can read the Intent that was used to start it.

As your activity starts, call getIntent() to retrieve the Intent that started the activity. You can do so at any time during the lifecycle of the activity, but you should generally do so during early callbacks such as onCreate() oronStart().

For example:

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

Return a Result


If you want to return a result to the activity that invoked yours, simply call setResult() to specify the result code and result Intent. When your operation is done and the user should return to the original activity, call finish() to close (and destroy) your activity. For example:

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

You must always specify a result code with the result. Generally, it’s either RESULT_OK or RESULT_CANCELED. You can then provide additional data with an Intent, as necessary.

Note: The result is set to RESULT_CANCELED by default. So, if the user presses the Back button before completing the action and before you set the result, the original activity receives the “canceled” result.

If you simply need to return an integer that indicates one of several result options, you can set the result code to any value higher than 0. If you use the result code to deliver an integer and you have no need to include the Intent, you can call setResult() and pass only a result code. For example:

setResult(RESULT_COLOR_RED);
finish();

In this case, there might be only a handful of possible results, so the result code is a locally defined integer (greater than 0). This works well when you’re returning a result to an activity in your own app, because the activity that receives the result can reference the public constant to determine the value of the result code.

Note: There’s no need to check whether your activity was started with startActivity() or startActivityForResult(). Simply call setResult() if the intent that started your activity might expect a result. If the originating activity had called startActivityForResult(), then the system delivers it the result you supply to setResult(); otherwise, the result is ignored.


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중