注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/basics/intents/result.html


启动另一个activity不一定是单向的。你也可以启动另一个Activity后,接收它返回的结果。为了接收结果,调用startActivityForResult()(而不是startActivity())。

例如,你的应用可以启动一个相机App,并且接受拍摄的照片作为结果。或者,你可以启动一个“联系人”App来让用户选择一个联系方式,而你将这些联系人的详细信息作为结果接收。

当然,这个响应intent的Activity必须是设计成可以返回一个结果的。当它确实可以时,它会以另一个Intent对象的形式将结果发送回来。你的Activity在onActivityResult()回调函数中接收它。

Note:

当你调用startActivityForResult()时,你可以使用显式地或者隐式的intent。当启动你的一个Activity来接收这个结果时,你应该使用显式地intent来保证你接收了期望的结果。

一). 启动Activity

当你希望启动一个返回结果的Activity时,你使用的Intent对象并没有什么别的特别的地方,但你需要给startActivityForResult()方法传递一个额外的整形参数。

整形参数是一个“需求码(request code)”,用它来标示你的需求。当你接收到装有结果的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);
}

 二). 接收结果

当用户在处理Intent的Activity中将事务处理完毕并且返回后,系统将会调用你的Activity的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)
}
}
}

在这个例子中,由Android联系人应用所返回的结果Intent提供了一个内容Uri,它标识出用户所选择的联系人信息。

为了成功处理这个结果,你必须结果Intent中数据的格式是怎么样的。当返回的结果来自于你自己的Acitivity时,处理起来是简单的。而Android内置的应用提供了它们自己的APIs,你可以利用它们获得指定的结果数据。例如,联系人应用返回的一般是标识了选中的联系人信息的内容URI,而相机应用返回的是存储于“data”中的一个Bitmap。(更多信息可以阅读: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开始,联系人应用会授权给你一个临时的权限,当联系人应用向你返回一个结果时,允许你从Contacts Provider中读取信息。但是这个临时权限值仅应用于需要被查询的那个联系人信息,所以你通过intent的Uri查询不到其它联系人信息,除非你申明了READ_CONTACTS的授权许可。

【Android Developers Training】 29. 从Activity获得结果的更多相关文章

  1. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 18. 重新创建一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 17. 停止和重启一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 16. 暂停和恢复一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 15. 启动一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 14. 序言:管理Activity生命周期

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 30. 允许其它应用启动你的Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 27. 序言:和其它应用交互

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 9. 覆盖于布局之上的Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. 用CSS3实现饼状loading效果

    原文地址:http://visugar.com/2017/05/17/CSS3%E9%A5%BC%E7%8A%B6loading%E6%95%88%E6%9E%9C/ 写在前面 (附录有源码及效果) ...

  2. Java实现的高效计数器

    本文转载地址:            http://blog.csdn.net/snarlfuture/article/details/17049731 在统计来自数据库或文本中某些内容的频率时,你可 ...

  3. java 操作 redis

    1.Java 使用 Redis 只需要下载一个jar包即可 地址:http://maven.outofmemory.cn/redis.clients/jedis/2.5.2/ 工程

  4. 四、 添加模型Model(ASP.NET MVC5 系列)

    在这一章节中我们将添加一些classes类来管理数据库中的movies.这些classes类就是ASP.NET MVC应用程序中的"model". 我们将用.NET框架中的数据访问 ...

  5. XInput和DirectInput

    原文链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx XInput是一个允许应用从W ...

  6. LindAgile.Modules模块化的设计

    在LindAgile中有一个比较主推的技术,就是模块化,一切组件都可以被抽象成一个小小的模块,而每个小模块的实现可能又有多种方式,如日志模块可以有LindLoger,Log4net等实现,而具体在程序 ...

  7. superagent和request结果转换区别

    superagent和request结果转换区别 使用superagent和request抓取页面内容时,两个抓取内容都可以被cheerio进行处理.但处理时有个细微差别. 1. 使用superage ...

  8. JVM的内存区域划分以及垃圾回收机制详解

    在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...

  9. hdu5803

    hdu5803 题意 给出四个整数 A B C D,问有多少个四元组 (a, b, c, d) 使 a + c > b + d 且 a + d >= b + c ,0 <= a &l ...

  10. (转)wxWidgets 2.9.2svn(3.x)最小体积编译方法

    官方论坛.网上记录的wxWidgets编译方法,会导致编译后的程序库非常大,原因在于对编译的方法选择不当.下面简单总结一下如何编译最新的SVN代码.下载最新源码(每日构建):http://biolpc ...