page.title=Получение результата операции page.tags=объекты Intent helpoutsWidget=true trainingnavtop=true @jd:body

Содержание этого урока

  1. Запуск операции
  2. Получение результата

См. также:

Запуск другой операции не обязательно должен быть односторонним действием. Вы можете запустить другую операцию и получить от нее результат. Для получения результата нужно вызвать метод {@link android.app.Activity#startActivityForResult startActivityForResult()} (вместо {@link android.app.Activity#startActivity startActivity()}).

Например, ваше приложение может запустить приложение для камеры и получить в качестве результата фотографию. Также вы можете запустить приложение "Люди", чтобы пользователь выбрал в нем контакт, и получить контактные данные в качестве результата.

Разумеется, отвечающая операция должна быть способной возвратить результат. При возврате результат отправляется как другой объект {@link android.content.Intent}. Ваша операция получает его в обратном вызове {@link android.app.Activity#onActivityResult onActivityResult()}.

Примечание. Вы можете использовать явные и неявные результаты при вызове {@link android.app.Activity#startActivityForResult startActivityForResult()}. При запуске собственной операции для получения результата вы должны использовать явные результаты, чтобы получить именно ожидаемый результат.

Запуск операции

В объекте {@link android.content.Intent}, используемом для запуска операции для получения результата, нет ничего особенного, однако нужно передать дополнительный целочисленный аргумент методы {@link android.app.Activity#startActivityForResult startActivityForResult()}.

Этот целочисленный аргумент представляет собой "код запроса", определяющий ваш запрос. Когда вы получите результат {@link android.content.Intent}, обратный вызов использует тот же самый код результата, чтобы ваше приложение могло правильно определить результат и понять, как его нужно обработать.

Например, вот так можно запустить операцию, позволяющую пользователю выбрать контакт:

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);
}

Получение результата

Когда пользователь завершит последующую операцию и вернется, система вызовет метод вашей операции {@link android.app.Activity#onActivityResult onActivityResult()}. Этот метод содержит три аргумента:

Например, результаты для намерения "Выбрать контакт" могут обрабатываться следующим образом:

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

В этом примере результаты, {@link android.content.Intent} возвращаемые приложениями Android Контакты или Люди, предоставляют контент {@link android.net.Uri}, который идентифицирует выбранный пользователем контакт.

Для успешной обработки результатов необходимо понимать, каким будет формат этих результатов {@link android.content.Intent}. Это просто, если результат возвращается одной из ваших собственных операций. Приложения, входящие в состав платформы Android, имеют собственные прикладные интерфейсы, так что вы можете рассчитывать на получение определенных результатов. Например, приложение "Люди" (приложение "Контакты" в старых версиях) всегда возвращает результат с URI контента, идентифицирующий выбранный контакт, а приложение "Камера" возвращает {@link android.graphics.Bitmap} в дополнительном {@code "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 {@link android.content.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...
        }
    }
}

Примечание. До выхода версии Android 2.3 (API-интерфейс уровня 9) для выполнения запроса {@link android.provider.ContactsContract.Contacts Contacts Provider} (как показанный выше) ваше приложение должно было декларировать разрешение {@link android.Manifest.permission#READ_CONTACTS} (см. Безопасность и разрешения). Однако, начиная с версии Android 2.3, приложение "Контакты/Люди" дает вашему приложению временное разрешение на чтение данных Поставщика контактов при выводе результата. Это временное разрешение действует только в отношении конкретного запрошенного контакта, так что нельзя запрашивать другой контакт, кроме указанного объектом Intent {@link android.net.Uri}, если вы не хотите декларировать разрешение {@link android.Manifest.permission#READ_CONTACTS}.