原文地址:http://android.xsoftlab.net/training/basics/intents/result.html

启动其它Activity并不是单方向的。你也可以启动其它Activity然后接收返回结果。如果要接收结果,应该调用startActivityForResult()而不是startActivity()。

举个例子,APP可以启动拍照APP然后接收捕捉到的图像作为结果。或者,你可能会启动一个People APP让用户选择一个联系人,然后接收联系人的详细信息作为返回结果。

当前,响应的activity必须要被设计为可以返回结果。当这样被设计了,它会发送另一个Intent对象作为结果。你的Activity会在onActivityResult()回调方法中接收到它。

Note:当你在调用startActivityForResult()方法的时候可以使用显式或者隐式的意图。当启动你自己的Activity接收结果时,你应该使用显式意图来确保你可以接收到期望的结果。

启动Activity

当在启动Activity的时候并没有特别指明Intent对象的结果,但是你还是需要传一个附加整型值给startActivityForResult()方法。

这个整型的参数被称为”request code”,它用来指明你的请求。当你接收到Intent的结果时,回调方法会提供相同的请求码,以便于APP可以适当的确认结果并决定怎么处理它。

举个例子,这里展示了如何启动一个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 numbersstartActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

接收结果

当用户操作完成并返回的时候,系统会调用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 toif (requestCode == PICK_CONTACT_REQUEST) {// Make sure the request was successfulif (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中的联系人或者其它People APP提供的Uri内容。

为了可以正确的处理结果,你必须得懂得Intent结果的格式。如果返回结果的Activity结果是你自己Activity的话那非常轻松。Android平台包含的APP提供了它们自己的API,这些API可以让你依靠指定的结果数据。举个例子,People APP(一些老版本上的联系人APP)总是会返回一个URI内容形式的结果。这个URI指明了选择的联系人,Camera APP会返回一个Bitmap对象,这个对象附加在”data”上。

额外奖励

上面的代码展示了如何获取联系人结果,但是没有详细的解释如何从结果中读取数据,因为这需要有关content providers的更进一步的讨论。然而,如果你特别好奇,这里有一些代码展示了如何从结果中查询数据,从而在选择的联系人中获得电话号码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {// Check which request it is that we're responding toif (requestCode == PICK_CONTACT_REQUEST) {// Make sure the request was successfulif (resultCode == RESULT_OK) {// Get the URI that points to the selected contactUri contactUri = data.getData();// We only need the NUMBER column, because there will be only one row in the resultString[] 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 columnint 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执行查询需要APP声明READ_CONTACTS权限。然而,从Android 2.3开始,当选择的结果返回时Contacts/People APP授予了APP一个临时权限来从Contacts Provider读取信息。这个临时的权限值适用于请求的指定联系人,所以不能够查询其它联系人信息,除非你声明了READ_CONTACTS权限。

Android官方开发文档Training系列课程中文版:与其它APP交互之从Activity获得结果相关推荐

  1. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  2. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  3. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  4. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

    原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...

  5. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之入门指南

    入门指南 欢迎来到安卓开发训练课,在这里你可以找到一系列课程来描述如何使用现有的代码示例来重新适用到你的APP上,你可以在左侧的导航栏顶部看到在若干个大项里有若干个有组织的子项课程.(导航栏请参见官方 ...

  6. Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放

    原文地址:http://android.xsoftlab.net/training/managing-audio/index.html 引言 如果APP需要播放音频,允许用户可以控制音频的播放状态是很 ...

  7. Android官方开发文档Training系列课程中文版:分享文件之获取文件信息

    原文地址:http://android.xsoftlab.net/training/secure-file-sharing/retrieve-info.html 之前的课程讲述了客户端APP试图与含有 ...

  8. Android官方开发文档Training系列课程中文版:APP的内存管理

    写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articl ...

  9. Android官方开发文档Training系列课程中文版:管理系统UI之隐藏状态条

    原文地址:http://android.xsoftlab.net/training/system-ui/status.html 这节课将会介绍如何隐藏不同的版本的状态条.隐藏状态条可以使内容展示区域更 ...

  10. Android官方开发文档Training系列课程中文版:多样屏幕之实现自适应UI

    原文地址:http://android.xsoftlab.net/training/multiscreen/adaptui.html 基于程序当前所显示的布局来说,UI流程可能会有所不同.比如说,如果 ...

最新文章

  1. CF1006E Military Problem
  2. mysql 回表 覆盖索引_MySQL 的覆盖索引与回表的使用方法
  3. 客户端负载均衡?? 服务端负载均衡??
  4. 虚拟机安装centeros7 无法连接网络 virsh命令找不到 删除多余的vir0 不然dubbo会有问题
  5. 问题 1074: 数字整除
  6. 蓝桥杯c语言a组省赛试题及答案,2016-蓝桥杯-省赛-C语言大学A组全部真题.doc
  7. 电脑反应慢卡怎么解决_电脑键盘失灵怎么解决
  8. C++中函数作为参数传递给其他函数
  9. texlive写论文源代码_基于中国人民大学LaTeX论文模板毕业论文,课程研究生硕士本科设计,ppt答辩,外文翻译程序源代码下载...
  10. Web UI设计基础
  11. 读书笔记:《人工智能》
  12. 魔兽世界怀旧服服务器显示地图,魔兽世界怀旧服:1-60级地图任务路线大全,快来拿走收藏!部落篇...
  13. 类加载器以及双亲委派模式
  14. px rpx pt em rem单位
  15. TIA博途中使用T-CONFIG指令修改S7-1200 PLC的IP地址和设备名称
  16. Java写计算器自闭了
  17. UI设计师是做什么的?
  18. netstat -ano 'netstat' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  19. OCR文字识别之CTC原理和实现
  20. 通电延时和断电延时的四种开关对应的梯形图

热门文章

  1. C C++面试常问简答题(2)
  2. 要想选到音质好的耳机,你应该需要知道这些~
  3. C语言结构体用法很多,坑也很多
  4. mysql用户数据导入_mysql创建数据库、用户及导入数据_mysql数据库教程
  5. mysql pdo prepare_PDO::prepare
  6. Linux下修改SSH登录端口
  7. CListCtrl::InsertColumn()和InsertItem()和SetItemText()
  8. spring生命周期七个过程_Spring杂文(三)Spring循环引用
  9. 五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)
  10. LeetCode 1730. 获取食物的最短路径(BFS)