注:本文翻译自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. 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)

    包括 Dockerfile 在内的任何脚本和程序都会出错.有错并不可怕,但必须有办法排查,所以本节讨论如何 debug Dockerfile. 先回顾一下通过 Dockerfile 构建镜像的过程: ...

  2. Linux(ubuntu)下jdk&tomcat的安装

    1.下载相应版本的jdk及tomcat:sudo wget ${url} 2.解压: tar zxvf jdk-7u79-linux-x64.tar.gz​ tar zxvf apache-tomca ...

  3. JSP页面的静态包含和动态包含

    JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含:<jsp:include page="被包含页面" ...

  4. 【原创】JQWidgets-TreeGrid 2、初探源码

    已知JQWidgets的TreeGrid组件依赖于jqxcore.js.jqxtreegrid.js,实际上它还依赖于jqxdatatable.js.我们先通过一个例子,来探索本次的话题. 需求: 图 ...

  5. VS2010 使用 EF5 框架步骤

    1.安装 nuget , 在nuget里联机查找 EF 5.x DbContext Generator for C# 模版下载安装 2.nuget 控制台执行 Install-Package Enti ...

  6. 汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快

    1. 介绍 本文对TinyPinyin.Pinyin4j与JPinyin三个汉字转拼音库的用法.测试代码及转换的结果做一个简单的总结. TinyPinyin 适用于Java和Android的快速.低内 ...

  7. 二识angularJS

    前言:记得三月份时下定决心说每天要更新一篇博客,学习点新东西,实践下来发现太不现实,生活中的事情很多,再喜欢也不能让它一件占据生活的全部吧,所以呢,以后顺其自然吧.之前有一篇'初识angular'因为 ...

  8. Assert与内存泄漏

    以前知道C/C++有assert之后,我想知道assert会不会造成内存泄漏,于是我做了一个测试: #include <iostream> #include <fstream> ...

  9. javaSE_05Java中方法(函数)与重载、递归-练习

    1.使用的递归的方法求5! public class DiGui{ public static void main(String[] args){ //使用的递归的方法求5! System.out.p ...

  10. 一些java考过的测试题和自己制作模拟服务端和客户端

    媒体 1,java环境变量: PATH: .;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;  CLASSPATH: .;%JAVA_HOME%\jre\lib\rt.jar ...