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

Запуск другой деятельности не обязательно должен быть односторонним. Вы можете также запустить другую деятельность и получить обратно результат. Чтобы получить результат, вызовите 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() метод. Этот метод имеет три аргумента:

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

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

Чтобы успешно обработать результат, вы должны понимать формат результата в Intent . Это легко, когда деятельность возвращающая результат является одной из ваших собственных. Приложения, работающие на Android платформе предлагают свои собственные API интерфейсы, на которые вы можете рассчитывать при получении конкретных результирующих данных. Например, приложение Люди (Контакты приложение со старыми версиями) всегда возвращает результат со ссылкой на содержание (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, приложение Контакты/Люди предоставляет вашему приложению временное разрешение на чтение из поставщика контактов, когда он вернул вам результат. Временное разрешение относится только к определенному запрашиваемому контакту, так что вы не можете запрашивать контакты, отличные от указанного в ссылке намерения Uri, если вы не объявили READ_CONTACTS разрешение.