반응형

 이전의 두 포스트는 여러분의 앱에서 다른 앱의 액티비티를 시작하는 방법에 대한 측면에 초첨이 맞추어져 있었습니다. 하지만 만약 여러분의 앱이 다른 앱에게 유용한 action 을 수행할 수 있다면, 여러분의 앱은 다른 앱으로부터 요청된 action에 응답할 수 있도록 미리 준비가 되어 있어야 합니다. 실예로, 만약 여러분이 사용자의 친구들과 메세지나 사진들을 공유할 수 있는 소셜(social) 앱을 만든다면,ACTION_SEND 인텐트를 지원하도록 하는 것이 가장 좋습니다. 그렇게 하면 사용자는 다른 앱으로부터 "공유(share)" action 을 시작되게 할 수 있으며 그 action을 수행할 수 있도록 여러분의 액티비티를 실행할 수 있습니다.


 다른 앱이 여러분의 액티비티를 시작하도록 하기 위해서는 앱의 메니페스트(manifest) 파일안에 해당하는 <activity> 요소에 대해<intent-filter> 요소를 추가할 필요가 있습니다.


 여러분의 앱이 디바이스에 설치되어있을 때, 시스템은 여러분의 인텐트 필터를 식별하며 모든 설치된 앱들에 의해 지원되는 인텐트들의 내부 카테고리에 정보를 추가합니다. 하나의 앱이 묵시적(implicit) 인텐트(Intent)로 startActivity() 또는 startActivityForResult() 메소드를 호출할 때, 시스템은 어떤 액티비티가 이 인텐트(Intent)에 응답할 수 있는지 찾게 됩니다.



인텐트 필터 추가하기(Add an Intent Filter)

---------------------------------

여러분의 액티비티가 처리할 수 있는 인텐트(Intent)들을 적절하게 정의하기 위해서는, 여러분이 추가한 인텐트 필터는 액티비티가 허용하는 action 과 data 의 타입 측면에서 가능한 명확하게 해야 합니다.


시스템은 액티비티가 가지고 있는 인텐트 필터가 아래에 있는 Intent 객체의 기준에 충족하면 주어진 Intent 를 액티비티에 전달 합니다.


Action

  수행하는 action 의 이름을 지정하는 문자열(String). 일반적으로 ACTION_SEND 또는 ACTION_VIEW 와 같은 값을 정의한 플랫폼 중 하나입니다.


 액티비티의 인텐트 필터안에 <action> 요소를 통해 지정합니다. 이 요소안에 지정하는 값은 API 상수을 대시하여 action에 대한 전체 문자열 이름으로 되어 있어야 합니다.(아래 예를 볼 수 있습니다.) 



Data

  인텐트와 함께 조합된 데이터의 세부사항


  액티비티의 인텐트 필터안에 <data> 요소를 통해 지정합니다. 이 요소안에 하나 또는 그 이상의 속성을 사용합니다. 여러분은 단지MIME타입만 저장하거나, URI 스키마 하나만 지정할 수도 있고, 또는 이것들과 허용되는 data 타입을 나타내는 다른 것들과 조합하여 지정할 수 있습니다.


Note : 만약 여러분이 Uri 데이터에 대해 세부사항을 선언할 필요가 없다면( 여러분의 액티비티가 URI를 대신해서 다른 종류의 "extra" 데이터를 처리할 때와 같이), 여러분은 text/plain 또는 image/jpeg 과 같이 여러분의 액티비티가 처리할 data의 타입을 선언하기 위해 오직android:mimeType 속성만을 지정하셔야만 합니다.



Category

   보통 사용자 제스쳐 또는 시작된 것으로 부터의 위치에 관련된 Intent 를 처리하는 액티비티를 특정하기 위해 추가적인 방법을 제공합니다. 시스템에 의해 지원되어지는 서로 다른 다양한 카테고리가 있습니다. 하지만 대부분은 드물게 사용되어 집니다. 어쨋든, 모든 묵시적(implicit) 인텐트(Intent)들은 디폴트로 CAREGORY_DEFAULT로 정의되어 집니다.


 액티비티의 인텐트 필터안에 <category> 요소를 통해 지정합니다.



인텐트 필터안에서, 여러분은 <intent-filter>요소에 자리한 해당 XML 요소와 그들 각각을 선언하여 액티비티가 허용하는 기준을 선언할 수 있습니다. 


예를들어 보겠습니다. 아래는 text 또는 image의 data 타입일 때 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>


각각의 들어오는 인텐트는 오직 하나의 action 과 하나의 data 타입을 지정합니다. 하지만 각각의 <intent-filter>요소안에는 <action>,<category>, 그리고 <data> 요소의 인스턴스를 여러개 선언해도 OK 입니다.


만약 action과 data로 된 2개의 쌍이 상호 배타적으로 동작한다면, 여러분은 data 타입에 부합되는 action 을 받아들일 수 있도록 지정하기 위해 별도로 구분된 인텐트 필터를 만들어야만 합니다.


예를 들어, 여러분의 액티비티가 ACTION_SEND 와 ACTION_SENDTO 인텐트 모두에서 text 와 image 를 모두 처리하도록 처리할 수 있도록 지원할 수 있습니다. 이런 경우, 여러분은 반드시 2개의 action 에 대해 별개의 구분된 인텐트 필터(Intent filter)를 정의해야만 합니다. 왜냐하면, ACTION_SENDTO 인텐트는 send 와 sendto URI 스키마(scheme)의 수신자 주소를 지정하는데 반드시 Uri data 를 사용해야만 하기 때문입니다. 예:

 <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 : 묵시적(implicit) 인텐트를 수신하기 위해서는, 반드시 인텐트 필터(Intent filter)안에 category 로 CATEGORY_DEFAULT 를 포함해야만 합니다. 카테고리에 CATEGORY_DEFAULT 로 선언함으로서 startActivity()  startActivityForResult() 메소드들은 선언된 인텐트들을 처리합니다. 만약 여러분이 인텐트필터안에 이 것을 선언하지 않는다면 묵시적 인텐트는 여러분의 액티비티를 처리하지 않을 겁니다.


소셜(social) 공유를 작업을 수행하기 위한 ACTION_SEND 인텐트를 전송하고 수신받는 것에 대한 추가 정보를 알고싶다면 개발자 사이트의 Receiving Simple Data from Other Apps 를 참조하시기 바랍니다.




액티비티에서 Intent 처리하기 (Handle the Intent in Your Activity)

--------------------------------------------------

여러분의 액티비티가 가지고 있는 action 이 무엇인지 결정하기 위해서 여러분은 액티비티를 시작하는데 사용한 Intent 객체를 읽을 수 있습니다.


여러분의 액티비티가 시작됨으로서, 액티비트를 실행시킨 Intent 객체를 복구하기 위해 getIntent() 메소드를 호출합니다. 여러분은 액티비티의 라이프사이클(lifecycle) 동안 어떤 순간에서든 이 작업을 할 수 있습니다. 하지만 일반적으로는 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 ...

    }

}



결과 리턴하기(Return a Result)

------------------------

만약 여러분의 액티비티를 발동시킨 액티비티로 결과(result)를 리턴하길 원한다면, 간단하게 setResult() 메소드를 호출하여 결과코드(result code) 와 결과 인텐트(result Intent) 를 지정할 수 있습니다. 액티비티가 여러분의 명령을 끝마쳤거나 사용자가 원래의 액티비티로 되돌아가길 원할 때, finish() 메소들를 호출하여 여러분의 액티비티를 정지(그리고 파괴Destroy) 시킵니다. 예:

 // 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)와 함께 결과코드(result code)를 지정해야만 합니다. 일반적으로 RESULT_OK 이거나 RESULT_CANCEL 을 사용합니다. 여러분은 필요하다면 Intent 안에 data를 추가적으로 제공할 수 있습니다.


Note : 결과(result)는 기본적으로 RESULT_CANCEL로 설정되어 있습니다. 그래서 action 을 완료하기 전에 사용자가 'Back' 버튼을 눌러서 결과(result)를 설정하기 전이라면 원래의 오리지널 액티비티는 "canceled" 결과를 받게 됩니다.


만약 다양한 결과(result) 옵션중 하나을 나타내는 정수형(integer) 결과를 리턴할 필요가 있다면, 여러분은 0 보다 큰 값으로 결과코드(result code)를 설정할 수 있습니다. 만약 여러분이 하나의 정수형(integer)를 전달하기 위해 result code 를 사용한다면 여러분은 Intent를 포함할 필요가 없습니다. 여러분은 setResult() 메소드를 호출하며 오직 result code 만 전달할 수 잇습니다. 예:


 setResult(RESULT_COLOR_RED);

 finish();


Note : 여러분은 여러분의 액티비티가 startActivity() 로 실행된건지 startActivityForResult()로 실행된건지 체크할 필요가 없습니다. 인텐트에 의해 시작된 여러분의 액티비티가 결과(result)를 기대한다면 간단하게 setResult()를 호출합니다. 만약 원래의 액티비티가startActivityforResult()를 호출햇다면, 시스템은 setResult()로 제공한 결과(result)를 전달할겁니다. 만약 그렇지 않다면 그 result는 무시될 겁니다.

반응형

+ Recent posts