Перейти к содержанию

Часто посещаемые

Недавно просмотренные

navigation

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

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

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

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

Примечание. Вы можете использовать явные и неявные результаты при вызове startActivityForResult(). При запуске собственной операции для получения результата вы должны использовать явные результаты, чтобы получить именно ожидаемый результат.

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

В объекте Intent, используемом для запуска операции для получения результата, нет ничего особенного, однако нужно передать дополнительный целочисленный аргумент методы startActivityForResult().

Этот целочисленный аргумент представляет собой "код запроса", определяющий ваш запрос. Когда вы получите результат 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);
}

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

Когда пользователь завершит последующую операцию и вернется, система вызовет метод вашей операции 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)
        }
    }
}

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

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

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

На этом сайте используются файлы cookie. Они нужны, чтобы сохранять ваши языковые настройки и параметры отображения страниц.

Хотите следить за новостями о разработке для Android и получать советы по созданию приложений для Google Play? Подпишитесь на нашу рассылку!

*Поля, обязательные для заполнения

Подписка оформлена.

Следите за новостями от Google Developers в WeChat

Изменить язык контента на этом сайте на ?

Вы хотите перевести страницу на , но в ваших языковых настройках для этого сайта указан другой язык ().

Изменить язык контента на ? Вернуться к прежнему языку или выбрать другой можно будет в меню внизу любой страницы.

Для этого класса требуется API уровня  и выше

Этот документ скрыт, так как для него и другой документации выбран API уровня . Изменить настройки можно над меню слева.

Узнать о том, какой уровень API следует указывать для своего приложения, можно здесь.

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)