6.2从活动获取结果

启动另一个活动不必是单向的。您也可以启动另一个活动,并接收一个结果回来。为了接收一个结果,调用startActivityForResult()(而不是startActivity())。

例如,您的应用程序可以启动照相机应用程序,并接收拍摄的照片作为结果。或者,您可能启动通讯录应用程序,让用户选择一个联系人,您会收到联系人详情作为结果。

当然,响应的活动必须设计为返回一个结果。当它这样做时,它会发送结果作为另一个Intent对象。你的活动在onActivityResult()回调方法中接收它。

注:当你调用startActivityForResult()时,您可以使用显式或隐式意图 。当启动一个自己的活动来接收一个结果时,你应该使用一个显式意图,以确保您收到预期的结果。

启动活动


在你为了结果启动活动时使用的意图对象,并没有什么特别,但你确实需要传递另外一个整数参数到startActivityForResult()方法。

整数参数是一个“请求码”,它确定您的要求。当您接收到结果意图,回调方法提供了同样的请求码,使您的应用程序可以正确识别结果,并决定如何处理它。

例如,以下是启动允许用户选择一个联系人的活动的方法,:

;  // 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);
}

接收结果


当用户完成后续活动和返回结果,系统调用活动的 onActivityResult()方法。这个方法有三个参数:

·      你传递给startActivityForResult()的请求代码。

·      第二个活动指定的结果代码。如果操作成功这可能是RESULT_OK,或者如果用户退出或操作由于某种原因失败了,就是RESULT_CANCELED

·      一个附带结果数据的意图

例如,以下是你处理“选择一个联系人”意图的结果的方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check whichrequest 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 whichcontact was selected.

// Do something with the contact here(bigger example below)
        }
    }
}

在这个例子中, Android通讯录或联系人应用程式返回的结果意图,提供了一个内容Uri标识用户选择的联系人。

为了成功地处理结果,你必须明白结果意图将会是什么格式 。当返回结果的活动是自己的活动之一时,这样做是很容易的。Android平台包含的应用程序提供自己的API,依靠这些API你可以得到特定的结果数据。例如,联系人应用程序(在一些比较旧的版本是通讯录应用程序)总是返回内容URI的结果,该URI标识选定的联系人,而相机应用程序在“data”extra中返回一个Bitmap(见捕捉照片一课)。

福利(Bonus):读取联系人数据

上面显示如何从联系人应用程序得到结果的代码并没有深入到如何实际从结果读取数据的细节,因为它需要关于内容提供者的更先进的讨论。但是,如果你很好奇,下面就有更多的代码,显示了如何查询结果数据来获得选定的联系人的电话号码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check whichrequest 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 selectedcontact
            Uri contactUri = data.getData();
            // We only need the NUMBER column, becausethere will be only one row in the result
            String[] projection = {Phone.NUMBER};

// Perform the query on the contact to getthe 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 becalled from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity ofthe 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 theNUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

// Do something with the phone number...
        }
    }
}

)之前,在联系供应者(如上面所示)上进行查询,需要您的应用程序声明READ_CONTACTS权限(见安全性和权限)。然而,从Android 2.3开始,通讯录/联系人应用程式授予您的应用程序一个临时的从联系供应商读取的权限,当它返回你一个结果。临时权限仅适用于特定联系人的请求,所以你不能查询意图的Uri指定联系人以外的联系人,除非你的确声明了READ_CONTACTS权限。

跟Google学习Android开发-起始篇-与其它应用程序交互(2)的更多相关文章

  1. 跟Google学习Android开发-起始篇-与其它应用程序交互(1)

    6 与其它应用程序交互 一个Android应用程序通常有多个活动.每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片).为了把用户从一个活动带到另一个,你的应用必须使用Int ...

  2. 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

    说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...

  3. 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)

    4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...

  4. 想学习Android开发

    最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...

  5. android初级应用到高端架构教程------ 完整体系化学习android开发

    系统的学习android开发技术,从应用到底层,再到架构,告别乱糟糟的学习方式,不再是抓不住重点.从上到下贯通,全面学习android开发.让你拥有清晰的思路,一步步学习android开发! 一般而言 ...

  6. Xamarin Android 之起始篇

    序言: 在博客园注册了已经有2年多了,快三年了.从开始学习这一行开始就在博客园注册了这个账号.至今也还没有写过一篇随笔,大多时候都是在园子里头潜水,看大牛写的文章,学习. 写博客不为啥,就是自己对自己 ...

  7. 站在巨人的肩膀上学习Android开发

    我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...

  8. 新人学习Android开发遇到的小问题总结

    1. IDE搭建: 搭建android的IDE时,先注意是什么版本的系统,64/32位系统. 通常使用的是Eclipse for android,Android Studio由于还需要FQ,网速慢,所 ...

  9. 10个学习Android开发的网站推荐

    1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会. 2. Android Gui ...

随机推荐

  1. php抓取ajax页面返回图片。

    要抓取的页面:http://pic.hao123.com/ 当我们往下滚动的时候,图片是用ajax来动态获取的.这就需要我们仔细分析页面了. 可以看到,异步加载的ajax文件为: http://pic ...

  2. [ExtJS5学习笔记]第十五节 Extjs5表格显示不友好?panel的frame属性在作怪

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39057243 sencha官方API:http://docs.sencha.com/e ...

  3. 一款简单的客户端安卓手机qq源码

    给大家分享一款比较简单的安卓手机qq应用源码,效果非常不错,大家可以借鉴一下,希望大家会喜欢. 1.png  (7.24 KB, 下载次数: 0) 02.png  (68.52 KB, 下载次数: 0 ...

  4. Office 2010 垃圾邮件过滤设置

    垃圾邮件过滤设置 有同事反馈给我,某些时候应该收到的邮件,却到了垃圾邮件里,给工作带来了不便,下面简单介绍一下outlook 2010 有关垃圾邮件的过滤设置. 1: 找到相关的邮件,点右键,在”垃圾 ...

  5. scanf()常犯错误

    ------------------------------------------------------------------------ <> 本意:接收字符串. 写成代码:voi ...

  6. c#--foreach遍历的用法与split的用法

    一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素.      该循环 ...

  7. 百度2015校园招聘自然语言处理project师面试

    面了一个多小时,大致回想下 1. 介绍一下简历上的项目 这个讲了好长时间,由于我做的是生物信息,面试官听得不太明确. 2. 一个城市每对夫妇都要生到一个男孩才停止生育,问终于该城市的男女比例 1:1, ...

  8. javascript每日一练(四)——DOM二

    一.DOM的创建,插入,删除 createElement(标签名) appendChild(节点) insertBefore(节点,原有节点) removeChild(节点) <!doctype ...

  9. No resource found that matches the given name 'android:WindowTitle'

    当你的androidAPI 由2.1版本更换成2.2版本时:  res/vavlues/styles.xml中使用的android:WindowTitle会报以下异常, error: Error re ...

  10. C++-struct类的新特性当class用

    #include <iostream> #include <iomanip> #include <string> using namespace std; stru ...