반응형

 다른 액티비티를 실행하는 것은 한가지 방법만 있는 것은 아닙니다. 여러분은 다른 액티비티를 실행하고 그 액티비티로부터 결과를 되돌려 받을 수도 있습니다. 결과를 받기 위해서는 startActivity() 를 대신해서 startActivityForResult() 메소드로 다른 액티비티를 실행해야 합니다.


 예를 들어보면, 여러분의 앱이 카메라 앱을 실행해서 촬영된 사진을 결과로 받을 수 있습니다. 또는 사용자가 연락처를 선택하기 위해People App( 예전 버전에서의 연락처 앱)을 실행하고 그 결과로 연락처의 상세내역을 받도록 할 수도 있습니다.


 물론, 응답하도록 되어 있는 액티비티는 반드시 결과(Result)를 리턴하도록 디자인 되어 있어야 합니다. 그렇게 되어 있을 때, 그 앱은 또다른 Intent 객체를 이용해서 결과를 보내줍니다. 여러분의 액티비티는 리턴된 결과를 onActivityResult() 콜백(callback) 메소드를 통해 받을 수 있습니다.


Note : 여러분은 startActivityForResult() 메소드를 호출할 때 명시적(explicit) 인텐트 또는 묵시적(implicit) 인텐트를 사용할 수 있습니다. 결과를 받기 위해 여러분의 앱안에 있는 액티비티들 중 하나를 실행할 경우에는 여러분이 기대하는 결과를 받을 수 있도록 보장하기 위해 명시적(explicit) 인텐트(intent)를 사용하는 것이 좋습니다.




액티비티 시작 (Start the Activity)

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

 결과(result)를 받기 위해 액티비티를 실행할 때 사용하는 Intent 객체는 특별할 것이 없습니다. 다만 startActivityForResult() 메소들 호출할 때 정수형(integer) 매개변수를 추가적으로 전달할 필요가 있습니다.


이 정수형(integer) 인자는 "요청코드(request code)"로서 여러분의 요청을 식별하는 용도입니다. 여러분이 결과(result) 인텐트(Intent)를 받을 때, onActivityResult() 콜백(callback) 메소드는 여러분이 결과 액티비티를 호출할 때 전달했던 것과 같은 요청코드(request code)를 제공합니다. 이로 인해서 여러분의 앱은 그 결과가 적절한 것인지 확인할 수 있고 그 것을 어떻게 처리할 것인지 결정할 수 있습니다.


아래는 사용자가 연락처를 선택하고 얻어오도록 하는 액티비티를 실행하는 방법의 예제입니다.

 static final int PICK_CONTACT_REQUEST = 1;  // The request code

 ...

 private void pickContact() {

     Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));

     pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers

     startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

 }

 



결과 받기 (Receive the Result)

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

 사용자가 다음 액티비티을 수행하고 다시 현재 액티비티로 되돌아 왔을 때, 시스템은 여러분의 액티비티의 onActivityResult() 메소드를 자동으로 호출합니다. 이 메소드는 3개의 인자(argument)를 포함하고 있습니다.


° startActivityForResult() 메소드를 호출할 때 전달했던 요청코드(request code)

° 두번째 액티비티에 의해 지정되어지는 결과코드(result code). 이 코드는 명령이 성공했을 때의 RESULT_OK 와 어떤 이유에 의해 명령이 실패하거나 사용자가 뒤로가기(back)을 통해 되돌아 올때의 RESULT_CANCELED 가 있을 수 있습니다.

° 결과(result) 데이터를 가지고 있는 Intent 객체


아래는 "연락처 얻기" 인텐트(Intent)에 대한 결과를 처리할 수 있는 방법에 대한 예제입니다.

 @Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    // Check which request we're responding to

    if (requestCode == PICK_CONTACT_REQUEST) {

        // Make sure the request was successful

        if (resultCode == RESULT_OK) {

            // The user picked a contact.

            // The Intent's data Uri identifies which contact was selected.


            // Do something with the contact here (bigger example below)

        }

    }

}

이 예제에서, Android의 연락처 앱(Contract 또는 People)에 의해 리턴된 결과(resultIntent 는 사용자가 선택한 연락처를 식별하는Content  Uri 객체를 제공합니다.


 이 결과(Result)를 성공적으로 처리하기 위해서는, 여러분은 반드시 결과가 될 Intent 의 형식이 무엇인지 이해하고 있어야 합니다. 여러분의 앱이 가지고 있는 액티비티들 중 하나로부터 결과를 되돌려 받을 때는 그 결과를 이해하는 것이 쉽습니다. 앱들은 Android 플랫폼이 특정 결과 데이터를 기대할 수있는 그들의 API 들을 포함하고 있습니다. 예를 들어, 연락처 앱(People) 앱은 항상 선택된 연락처를 식별할 수 있는 Content  Uri 를 결과로 돌려줍니다. 그리고 카메라 앱 같은 경우에는 Intent의 extra "data" 안에 Bitmap 객체를 리턴합니다(개발자 사이트의 Capturing Photos 에 대한 클래스를 참고하세요).



추가설명 : 연락처 데이터 읽기 ( Bonus : Read the contact data )

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

 People 앱으로부터 결과를 받기 위한 방법을 보여주는 위의 코드는 결과(result)로부터 실제 데이터를 읽어들이는 방법에 대해서는 세부적으로서 소개하고 있지는 않습니다. 왜냐하면, 이 작업을 하려면 Content Provider 에대한 좀더 향샹된 설명이 요구되기 때문입니다. 어쨋든, 만약 여러분이 이에 대해 관심이 있다면, 아래의 코드를 보시기 바랍니다. 아래의 몇가지 추가된 코드는 선택된 연락처로부터 전화번호를 얻기위해 결과 데이터(result data)를 요청하는 방법을 보여주고 있습니다.

 @Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    // Check which request it is that we're responding to

    if (requestCode == PICK_CONTACT_REQUEST) {

        // Make sure the request was successful

        if (resultCode == RESULT_OK) {

            // Get the URI that points to the selected contact

            Uri contactUri = data.getData();

            // We only need the NUMBER column, because there will be only one row in the result

            String[] projection = {Phone.NUMBER};


            // Perform the query on the contact to get the NUMBER column

            // We don't need a selection or sort order (there's only one result for the given URI)

            // CAUTION: The query() method should be called from a separate thread to avoid blocking

            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)

            // Consider using CursorLoader to perform the query.

            Cursor cursor = getContentResolver()

                    .query(contactUri, projection, null, null, null);

            cursor.moveToFirst();


            // Retrieve the phone number from the NUMBER column

            int column = cursor.getColumnIndex(Phone.NUMBER);

            String number = cursor.getString(column);


            // Do something with the phone number...

        }

    }

}


Note : Android 2.3( API level 9) 이전에는 Contacts Provider 의 요청을 수행하기위해(위에 보여젔던 것과 같이) 여러분의 앱에READ_CONTACTS 퍼미션(permission) 을 선언하도록 요구했었습니다. 어쨋든, Android 2.3 부터는 Contacts/People 에 대해 여러분이 하나의 결과를 리턴할 때 Contacts Provider 로부터 읽어들일 수 있는 임시 퍼미션을 여러분의 앱에 허가합니다. 임시 퍼미션은 오직 요청된 특정 연락처(contact) 만을 제공합니다. 그래서 여러분은 READ_CONTACTS 퍼미션 선언 없이 intent 의 Uri에 의해 지정된 하나 이상의 연락처를 요청할 수 없습니다.

반응형

+ Recent posts