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. docker学习笔记16:Dockerfile 指令 ADD 和 COPY介绍

    一.ADD指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD  源路径  目标路径 如: #test FROM ubunt ...

  2. Poj 2777 Count Color(线段树基础)

    又毁三观了.......虽然题目数据有坑:区间[a,b]可能会有a>b的情况,但是我一开始没有考虑它也能过. 此外莫名其妙的TLE #include <iostream> #incl ...

  3. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  4. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  5. ZYSocket 4.3.5 SOCKET框架组 发布[NEW]

    最新代码请到 github: https://github.com/luyikk/ZYSOCKET 更新 4.3.5更新说明: 修复各种BUG. 重写了一份 protobuf-net 有什么用呢,不需 ...

  6. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  7. hdu 2546 饭卡 01背包

    先将前n-1个从小到大排序.对m-5进行01背包.然后答案就是m-dp[m-5]-a[n-1] 至于为什么最后减去最贵的菜品,而不是把最贵的菜品也放到01背包里呢, 由于假设能够把最贵菜品a[n-1] ...

  8. IT忍者神龟之Oracle DBA经常使用查询吐血列举

    –1. 查询系统全部对象 select owner, object_name, object_type, created, last_ddl_time, timestamp, status from ...

  9. [置顶] 殊途同归——总结asp.net

    怀着期望,忐忑的心情看完了asp.net的一部分视频,这部分的学习也到了一个段落,颗粒归仓的工作还是要做的,但是有什么比一张图来得更直观有效呢? 先来张图,这次真的是有图有真相: 通过asp.net的 ...

  10. 安卓面试精华(Activity部分)

    过几天小弟要去面试了,当然免不了要好好复习下功课,其实很多东西也不是特别清楚,今天都当作一个回顾和巩固,希望我的这篇文章能对即将去找工作的同学有所帮助. 1. Q:什么是activity? 虽然这个问 ...