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. POJ2125 Destroying The Graph 二分图 + 最小点权覆盖 + 最小割

    思路来源:http://blog.csdn.net/lenleaves/article/details/7873441 求最小点权覆盖,同样求一个最小割,但是要求出割去了那些边, 只要用最终的剩余网络 ...

  2. Ural 1450 求最长路 SPFA

    题意就是求S点到T点的有向无环图中的最长路. 用SPFA可以解决. 一开始一直RE的原因 QAQ 竟然是在开Edge 邻接表的时候开小了 改了一下4Y #include <stdio.h> ...

  3. hdu1853解题报告

    题意和解决回路匹配的思路如同hdu3488 (这里我第一次想到最短路,但是对于有回路这个不知道怎么处理,后来看了别人的解题报告才知道KM匹配,但是看到KM之后就自己想...想了很久....还是不知道回 ...

  4. 亚马逊带Marketplace product code的image无法再mount到其他镜像上

    这是对已发布镜像的保护么?难道对其进行修改的路彻底断掉了? 以volume形式attach也不行,dd成raw再读取也读不了,敢问路在何方呢 If a volume has an AWS Market ...

  5. Website 内容管理

    公司网站后是这样的. 用的是中企动力的,后台还是比较好管理的.所以不多说什么了.

  6. 高斯拉普拉斯算子(Laplace of Gaussian)

    高斯拉普拉斯(Laplace of Gaussian) kezunhai@gmail.com http://blog.csdn.net/kezunhai Laplace算子作为一种优秀的边缘检测算子, ...

  7. SQLServer分页查询存储过程

    项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,     ...

  8. JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题

    前面使用easy ui来实现了一个tabs标签(http://blog.csdn.net/yysyangyangyangshan/article/details/38307477),只是在ASP.NE ...

  9. 在vc中使用xtremetoolkit界面库-----安装及环境配置

    近期想用一下xtremetoolkitPro界面库.网上的使用教程资源也不多,当中着实遇到了很多的困难,毕竟是首次使用. 首先当然是配置发开环境了: 我使用的是vc6.0+xtremetoolkitP ...

  10. The parent project must have a packaging type of POM

    在Eclipse中使用Maven添加模块时报错:The parent project must have a packaging type of POM 解决办法: 是将pom.xml 中的  < ...