page.title=Получение результата операции page.tags=объекты Intent helpoutsWidget=true trainingnavtop=true @jd:body
Запуск другой операции не обязательно должен быть односторонним действием. Вы можете запустить другую операцию и получить от нее результат. Для получения результата нужно вызвать метод {@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}.