项目中经常会需要跳转页面并且带值过去,那么跳转页面时候我们就可以使用startActivity(),我们可以使用intent,bundle,传值都可以,那么当我们跳转过去还需要得到返回值时候我们可以使用startActivityForResult() 来实现(例如,我们需要获取一个联系人信息,城市地区选择)如果页面1-->跳转到页面2,页面2跳转到页面3,最终页面1需要拿到页面3的返回值(例:主页面-->城市选择省份->城市选择某个省内的市,最终主页面得到市),这种用startActivityForResult() 也是可以实现的。
启动另外一个activity并不一定是单向的。我们也可以启动另外一个activity然后接受一个返回的result。为接受result,我们需要使用startActivityForResult() ,而不是startActivity()。
例如,我们的app可以启动一个camera程序并接受拍的照片作为result。或者可以启动联系人程序并获取其中联系的人的详情作为result。
当然,被启动的activity需要指定返回的result。它需要把这个result作为另外一个intent对象返回,我们的activity需要在onActivityResult()的回调方法里面去接收result。
启动Activity
对于startActivityForResult() 方法中的intent与之前介绍的并无太大差异,不过是需要在这个方法里面多添加一个int类型的参数。
该integer参数称为"request code",用于标识请求。当我们接收到result Intent时,可从回调方法里面的参数去判断这个result是否是我们想要的。
例如,下面是一个启动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);
}
接收Result
当用户完成了启动之后activity操作之后,系统会调用我们activity中的onActivityResult() 回调方法。该方法有三个参数:
- 通过startActivityForResult()传递的request code。
- 第二个activity指定的result code。如果操作成功则是
RESULT_OK
,如果用户没有操作成功,而是直接点击回退或者其他什么原因,那么则是RESULT_CANCELED
- 包含了所返回result数据的intent。
本例中被返回的Intent使用Uri的形式来表示返回的联系人。
为正确处理这些result,我们必须了解那些result intent的格式。对于自己程序里面的返回result是比较简单的。Apps都会有一些自己的api来指定特定的数据。例如,People app (Contacts app on some older versions) 总是返回一个URI来指定选择的contact,Camera app 则是在data
数据区返回一个 Bitmap (see the class about Capturing Photos).
读取联系人数据
上面的代码展示了如何获取联系人的返回结果,但没有说清楚如何从结果中读取数据,因为这需要更多关于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...
}
}
Note:在Android 2.3 (API level 9)之前对Contacts Provider
的请求(比如上面的代码),需要声明READ_CONTACTS
权限(更多详见Security and Permissions)。但如果是Android 2.3以上的系统就不需要这么做。但这种临时权限也仅限于特定的请求,所以仍无法获取除返回的Intent以外的联系人信息,除非声明了READ_CONTACTS
权限。
返回Result
如果想返回一个result给启动的那个activity,仅仅需要执行setResult(),通过指定一个result code与result intent。操作完成之后,用户需要返回到原来的activity,通过执行finish() 关闭被唤起的activity。
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();
我们必须总是指定一个result code。通常不是RESULT_OK
就是RESULT_CANCELED
。我们可以通过Intent 来添加需要返回的数据。
Note:默认的result code是
RESULT_CANCELED
.因此,如果用户在没有完成操作之前点击了back key,那么之前的activity接受到的result code就是"canceled"。
如果只是纯粹想要返回一个int来表示某些返回的result数据之一,则可以设置result code为任何大于0的数值。如果我们返回的result只是一个int,那么连intent都可以不需要返回了,可以调用setResult()
然后只传递result code如下:
setResult(RESULT_COLOR_RED);
finish();
Note:我们没有必要在意自己的activity是被用startActivity() 还是 startActivityForResult()方法所叫起的。系统会自动去判断该如何传递result。在不需要的result的case下,result会被自动忽略。
相关权限链接:http://blog.csdn.net/stephen255/article/details/9142923
获取通讯录联系人:http://blog.csdn.net/xys289187120/article/details/6730957