Запуск другой activity не обязательно должен быть односторонним. Вы можете также запустить другую activity и получить обратно результат. Чтобы получить результат, вызовите startActivityForResult()
(вместоstartActivity()
).
Например, ваше приложение может запустить приложение камеры и получить сделанный снимок в качестве результата. Или, вы можете запустить приложение Люди для того, чтобы пользователь выбрал контакт, и в результате вы получите контактную информацию.
Конечно, activity которая отвечает должна быть предназначена для возврата результата. Когда это происходит, то результат посылается как другой Intent
объект. Ваша activity получает его в onActivityResult()
методе обратного вызова.
Примечание: Вы можете использовать явные или неявные намерения при вызовеstartActivityForResult()
. При запуске одной из ваших собственных activity для получения результата, вы должны использовать явное намерение, чтобы гарантировать, что вы получите ожидаемый результат.
[wpanchor id=”1″]
Запустить activity
Нет ничего особенного касательно Intent
объекта, используемого при запуске activity для получения результата, но вы должны передать дополнительный целочисленный аргумент вstartActivityForResult()
метод.
Целочисленный аргумент это “код запроса”, который идентифицирует ваш запрос. Когда вы получаете результирующий Intent
, метод обратного вызова предоставляет тот же код запроса, чтобы ваше приложение могло правильно идентифицировать результат, и определить как его обработать.
Например, вот как запустить activity , которая позволяет пользователю выбрать контакт:
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); }
[wpanchor id=”2″]
Получить результат
Когда пользователь завершит работу с последующей activity и вернется в приложение, система вызывает для вашей activity onActivityResult()
метод. Этот метод имеет три аргумента:
- Код запроса, который вы передали в
startActivityForResult()
. - Код результата задаваемый второй activity . Это либо
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
. Это легко, когда activity возвращающая результат является одной из ваших собственных. Приложения, работающие на 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
разрешение.