Starting another activity doesn't have to be one-way. You can also start another activity and receive a result back. To receive a result, call
startActivityForResult()
(instead of startActivity()
).
For example, your app can start a camera app and receive the captured photo as a result. Or, you might start the People app in order for the user to select a contact and you'll receive the contact details as a result.
Of course, the activity that responds must be designed to return a result. When it does, it sends the result as another
Intent
object. Your activity receives it in the
onActivityResult()
callback.
Note: You can use explicit or implicit intents when you call
startActivityForResult()
. When starting one of your own activities to receive a result, you should use an explicit intent to ensure that you receive the expected result.
Start the Activity
There's nothing special about the Intent
object you use when starting an activity for a result, but you do need to pass an additional integer argument to the
startActivityForResult()
method.
The integer argument is a "request code" that identifies your request. When you receive the result
Intent
, the callback provides the same request code so that your app can properly identify the result and determine how to handle it.
For example, here's how to start an activity that allows the user to pick a contact:
static final int PICK_CONTACT_REQUEST = 1; // The request code
...
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, new Uri("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
Receive the Result
When the user is done with the subsequent activity and returns, the system calls your activity's
onActivityResult()
method. This method includes three arguments:
- The request code you passed to
startActivityForResult()
.
- A result code specified by the second activity. This is either
RESULT_OK
if the operation was successful or
RESULT_CANCELED
if the user backed out or the operation failed for some reason.
- An
Intent
that carries the result data.
For example, here's how you can handle the result for the "pick a contact" 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)
}
}
}
In this example, the result Intent
returned by Android's Contacts or People app provides a content
Uri
that identifies the contact the user selected.
In order to successfully handle the result, you must understand what the format of the result
Intent
will be. Doing so is easy when the activity returning a result is one of your own activities. Apps included with the Android platform offer their own APIs that you can count on for specific result data. For instance, the People
app (Contacts app on some older versions) always returns a result with the content URI that identifies the selected contact, and the Camera app returns a
Bitmap
in the "data"
extra (see the class about
Capturing Photos).
Bonus: Read the contact data
The code above showing how to get a result from the People app doesn't go into details about how to actually read the data from the result, because it requires more advanced discussion about
content providers. However, if you're curious, here's some more code that shows how to query the result data to get the phone number from the selected contact:
@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...
}
}
}
Note: Before Android 2.3 (API level 9), performing a query on the
Contacts Provider
(like the one shown above) requires that your app declare the
READ_CONTACTS
permission (see Security and Permissions). However, beginning with Android 2.3, the Contacts/People app grants your app a temporary permission to read from the Contacts Provider when it returns you a
result. The temporary permission applies only to the specific contact requested, so you cannot query a contact other than the one specified by the intent's
Uri
, unless you do declare the READ_CONTACTS
permission.
分享到:
相关推荐
This course is meant for programmers who wants to learn Python programming from a basic to an expert level. The course is mostly self-contained and introduces Python programming to a new reader and ...
如何使用好oracle的CBO特性,如何收集正确的统计信息
Oracle Data Integrator....
Getting a value from an array 65 Chapter 3: Working with the Database 67 Executing a query 70 Loading the first cell from the result of a query 72 Loading the first record from a query 74 This ...
demonstrates how to create the same project from scratch. The project will work on the PSoC Development Kit (CY8CKIT-001) as well as on PSoC3 FirstTouch Starter Kit (CY8CKIT-003) without any changes.
Packed with the latest and most effective strategies for landing a lucrative job in this popular and quickly-growing field, Getting an Information Security Job For Dummies provides no-nonsense ...
Ansoft官方出品的PExprt入门教材,新手入门:电感器设计实例。
Getting started with a new Single Page Application (SPA) JavaScript framework can be an overwhelming task, but Vue.js makes this daunting task simple and easy to learn, allowing you to start ...
Getting a BigData Job For Dummies provides an overview of the big datacareer arc, and then shows you how to get your foot in the doorwith topics like: * The education you need to succeed * The range ...
To use the introductory examples in this guide, all you need an Arduino Uno or earlier model, along with USB A-B cable and an LED. The easy-to-use Arduino development environment is free to download.
Today, as commonly recognized, beyond such a professional definition from history, the general perception of a robot is a manipulatable system to mimic a human with not only the physical structure, ...
There are a multitude of books out there to help you hone your Verification skills, as almost every Digital IC professional ...from advanced concepts (the Factory, register package prediction, etc.)
Getting Started with C++ Audio Programming for Game Developers covers a broad range of topics – from loading and playing audio files to simulating sounds within a virtual environment and implementing...
Getting started with a new Single Page Application (SPA) JavaScript framework can be an overwhelming task, but Vue.js makes this daunting task simple and easy to learn, allowing you to start ...
Now you can launch an explicit Activity like this: SmartGo.from(this) .to(ExplicitActivity.class) .shareElements() .like(v) .withSystemUI() .go(); or an implicit Activity like: SmartGo.from(this)...
In each chapter, readers complete an application project using multiple products from the browser/client side to the server side. This edition includes new chapters and sections on big data analysis,...
最新的hdfs namenode主备安装文档,详细,命令只需要copy执行即可
Getting Started with Twitter Flight offers the reader insight into why Flight was created and how to use it to build performant, powerful web apps from a unique perspective – that of someone who has ...
Getting a Project Done On Time.ppt