源地址:http://developer.android.com/training/basics/intents/result.html
启动另外一个activity的方法不止一个模式,你也可以启动一个activity同时可以获取这个activity最后的返回结果。想要获取到返回的结果,需要使用startActivityForResult()代替startActivity()来启动activity。
比方说,你的APP启动相机APP的activity来拍照,完成之后可以获取到最后的拍照结果。又或者你需要启动联系人APP,然后选择一个联系人,把联系人的详细信息作为返回结果。
当然,这些这些可以产生反馈的APP必须被设置为返回一个结果。当执行返回结果的时候,这个结果是被作为 一个Intent对象返回的。你的activity可以在
onActivityResult()函数里面接收这个返回的intent.
注意:在调用
startActivityForResult()的时候,使用明确或者模糊的intent都可以。当启动你的APP自己的一个activity来获取这个activity的返回结果的时候,需要明确要启动的activity,来保证获取到的是你想要的结果。
启动Activity
使用
Intent对象来启动一个activity来获取返回结果的时候,和之前说的启动activity的方法没什么大的区别,但是需要在
startActivityForResult()里面添加一个额外的整型参数。
这个整型参数是作为我们这个动作的请求代码。当我们接受返回的intent结果的时候,回调函数
onActivityResult()会返回一样的请求代码,这样我们就可以正确的区别我们的返回结果是哪个,从而进行正确的处理。
下面就是如何启动一个activity,来选择一个联系人:
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);
}
接收返回结果
当用户结束后面启动的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系统的通讯录APP,或者其他的联系人APP返回,在intent里面提供一个
Uri地址,标示用户选择的联系人。
为了正确的处理返回的intent结果,我们需要知道返回的intent的格式。当然如果是我们自己的APP返回的intent,我们很清楚它里面的格式,包含有哪些信息。android平台自带的那些APP都提供了自己的API,你可以利用这些API来识别具体返回的数据。例如,联系人APP(如早些版本上的联系人),它总是会返回衣蛾包含有Uri地址的intent结果,用这个Uri来识别被选中的联系人。相机应用返回的intent里面总是包含一个有Bitmap的exta数据”data”(详情阅读:Capturing Photos)。
额外讲解:读取联系人
上面的内容讲述了如果从联系人APP返回一个选择结果intent,但是没有讲述如何真正的去读取返回结果里面的数据,这个需要对content providers进行更高级的探讨。如果你很好奇,下面是一些代码,展示了如何查询返回结果里面的数据,来获取选择的联系人的联系号码:
@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...
}
}