注:本文翻译自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. vue、rollup、sass、requirejs组成的vueManager

    近段时间本人一直在思考如何基于vue搭建一个中后端管理系统的通用基础前端解决方案.思考的主要问题点如下: 如何使各个子业务模块的按需加载 css预处理方案的选择 如何引入现代的前端工程思想,也就是工程 ...

  2. 在linux服务器上发布web应用的完整过程

    首先你要有一个完整的web应用的小Demo,一个简单的demo就可以了,但是要涉及到数据库,笔者这里简单的模拟一个登陆的过程. 在本地测试,访问项目: 键入账号密码,点击登陆: 就是这么个简单的动作, ...

  3. MyBatis之级联小结

    在这之前我们知道了MyBatis为我们提供了三种级联:一对一关系(assocation).一对多关系(collection).鉴别器(discriminator).在最后一个鉴别器例子中,看到了当层级 ...

  4. 【基础】新手任务,五分钟全面掌握JQuery选择器

    1. 基本选择器 1.1 ID选择器: //选中id为myDiv的元素,速度最快 $("#myDiv") 1.2 类选择器: //选中class属性为red的所有元素 $(&quo ...

  5. mac Ubuntu 设置快捷进入目录

    在我们实际工作中,好多时间需要经常性的进入某个目录查看文件等等之类的操作. 好多时候我们都是在终端一级一级的进入目录,相比较Windows的快捷方式有点繁琐. 废话少说,下面就是设置快捷方式的方法: ...

  6. C#特性:从自定义一个特性开始,谈谈什么是特性

    作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了. ...

  7. JSP----获取表单参数

    在页面中可大量使用 request 对象来获取表单域的值,获取表单域的值有如下两个 方法. • String getParamete(String para mN ame): 获取表单域的值. • S ...

  8. (入门篇 NettyNIO开发指南)第三章-Netty入门应用

    作为Netty的第一个应用程序,我们依然以第2章的时间服务器为例进行开发,通过Netty版本的时间服务报的开发,让初学者尽快学到如何搭建Netty开发环境和!运行Netty应用程序. 如果你已经熟悉N ...

  9. Django框架全面讲解

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  10. ORACLE的监听日志太大,客户端无法连接

    数据库sqlplus能连接,plsql连接失败,也不报错,就定位到了是不是监听出了什么问题,删除监听,重建监听,重启监听,各种尝试都没解决问题. 却是监听日志太大导致的问题,一下是处理步骤: 查看监听 ...