启动其它Activity不是单向的。你也能启动其它Activity并获取一个返回结果。为了获取一个结果,调用startActivityForResult()方法(替代startActivity()方法)。

例如,你的应用程序能启动一个照相机应用程序,并获取捕捉的相片作为结果。或者,你可能启动People应用程序,为了用户选择一个联系人,并且你将会获取这个联系的的详细信息作为结果。

当然,这个响应Activity必须被设计来返回一个结果。当它执行的时候,它发送这个结果作为其它Intent对象。你的Activity在onActivityResult()回调方法中获取它。

注意:你能使用显示的或者隐式的意图,当你调用startActivityForResult()方法的时候。当启动一个你自己的Activity来获取一个结果的时候,你应该使用一个明确的意图来确保你获取获取期望的结果。

启动Activity

——————————————————————————————————————————————————————————————

当你启动一个Activity返回结果的时候,这里没有指定关于你使用Intent对象的任何事情,但是你需要传递一个额外的整型参数给startActivityForResult()方法。

这个整型参数是一个“请求码“,他确定你的请求。但你获取这个结果Intent的时候,回调方法提供了相同的访问码,以至于你的应用程序能正确的识别这个结果,并决定如何处理它。

例如,这里是如何启动一个Activity,它允许用户来获取一个联系人:

  1. static final int PICK_CONTACT_REQUEST = 1;  // The request code
  2. ...
  3. private void pickContact() {
  4. Intent pickContactIntent = new Intent(Intent.ACTION_PICK, new Uri("content://contacts"));
  5. pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
  6. startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
  7. }

获取结果

——————————————————————————————————————————————————————————————

当用户处理了后来的Activity并返回的时候,系统调用你的Activty的onActivityResult()方法。这个方法包含三个参数:

  • 你传递给startActivityForResult()方法的请求码。

  • 被第二个Activity指定的结果码。这个是RESULT_OK如果操作成功,或者RESULT_CANCLED如果用户返回或者操作由于一些原因失败。

  • 携带结果码的一个Intent。

例如,这里是你如何处理这个”获取一个联系“意图的记过:

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. // Check which request we're responding to
  4. if (requestCode == PICK_CONTACT_REQUEST) {
  5. // Make sure the request was successful
  6. if (resultCode == RESULT_OK) {
  7. // The user picked a contact.
  8. // The Intent's data Uri identifies which contact was selected.
  9. // Do something with the contact here (bigger example below)
  10. }
  11. }
  12. }

在这个例子中,结果Intent通过Andrid的Contacts或者People应用程序提供一个内容Uri被返回,它确定用户选择的联系人。

为了成功的处理这个结果,你必须懂得结果Intent的格式。当Activity返回的结果是一个你自己的Activity的时候是非常简单的。包含在Android平台中的应用程序支持你能指定特定结果数据的API。例如,People应用程序(联系人应用程序在一些老的版本)总是返回一个结果,伴随着content URI,它指定了被选择的联系人,并且Camera应用程序在”data”额外数据中返回一个Bitmap(查看关于Capturing Photos的课程)。

额外:读取联系人数据

上面显示的如何从People应用程序获取一个结果的代码,没有关于如何从这个结果中读取数据的详细说明,因为它需要在content provider中需要更详细的讨论。然而,如果你很好奇,这里有一些代码,它展示了如何查询从选择额联系人获取电话号码结果数据:

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. // Check which request it is that we're responding to
  4. if (requestCode == PICK_CONTACT_REQUEST) {
  5. // Make sure the request was successful
  6. if (resultCode == RESULT_OK) {
  7. // Get the URI that points to the selected contact
  8. Uri contactUri = data.getData();
  9. // We only need the NUMBER column, because there will be only one row in the result
  10. String[] projection = {Phone.NUMBER};
  11. // Perform the query on the contact to get the NUMBER column
  12. // We don't need a selection or sort order (there's only one result for the given URI)
  13. // CAUTION: The query() method should be called from a separate thread to avoid blocking
  14. // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
  15. // Consider using CursorLoader to perform the query.
  16. Cursor cursor = getContentResolver()
  17. .query(contactUri, projection, null, null, null);
  18. cursor.moveToFirst();
  19. // Retrieve the phone number from the NUMBER column
  20. int column = cursor.getColumnIndex(Phone.NUMBER);
  21. String number = cursor.getString(column);
  22. // Do something with the phone number...
  23. }
  24. }
  25. }

注意:在Andrid2.3之前(API Level 9),在这个Content Provider中执行一个查询(想上上面显示的)要求你的应用程序声明READ_CONTACTS权限(查看Security and Permissions)。然而,从Android2.3开始,Contacts/People应用程序授予应用程序临时的权限,当它返回你一个结果的时候读取联系人Provider。这个临时的权限仅仅应用给指定的联系人请求,所以你不能查询一个其它联系人,除了通过Intent的Uri被指定,至少你要声明READ_CONTACTS权限。

Android Developers:从一个Activity获取结果的更多相关文章

  1. Android世界第一个activity启动过程

    Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...

  2. 【Android Developers Training】 99. 获取联系人详细信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 98. 获取联系人列表

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 39. 获取文件信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. android 开发 实现一个activity变成dialog对话框

    效果图: 首先说说为什么需要大费周章的去用activity实现一个dialog,明明android系统已经提供了一个更方便的dialog了.原因如下: 1.activity模式的dialog可以实现更 ...

  6. startActivityForResult调用另外一个Activity获取返回结果

    startActivityForResult(intent,requestCode)可以调用另外一个Activity,并返回结果. 换头像案例 activity_main.xml <?xml v ...

  7. android开发中一个activity如何调用另一个xml中的控件

    有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...

  8. Android 只开启一个Activity实例

    在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...

  9. (转)Android 只开启一个Activity实例

    在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...

随机推荐

  1. 在linux下makefile的使用

    在linux下makefile的使用

  2. Spring的PropertyPlaceholderConfigurer事例应用

    在开发的过程中,经常发现一些类似:${log4j.level}之类的内容,后来才知道原因.下面解释一下: 1.PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现 ...

  3. [转]java 自动装箱与拆箱

    转自:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好 ...

  4. Git诞生

    很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与 ...

  5. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  6. cocos2d-js 3.0 rc2 自定义UI控件组件 例子:能播放动画的MenuItem。MenuItemSprite的bug

    其实总体自定义UI组件都比较简单,尤其是cocos2d-js是开源的,如果有什么不明白的直接看js代码或者C++代码即可.当然js代码基本就够了. 另外,js的ctor函数虽然说是构造函数,但毕竟不是 ...

  7. golang 垃圾回收机制

    用任何带 GC 的语言最后都要直面 GC 问题.在以前学习 C# 的时候就被迫读了一大堆 .NET Garbage Collection 的文档.最近也学习了一番 golang 的垃圾回收机制,在这里 ...

  8. 〖Linux〗tmux 配置文件

    tmux中默认的shell是zsh,zsh在日常中使用可以协助我们高效地使用shell命令. 配置文件默认位置 ~/.tmux.conf,此外,把常用快捷键也附录在这里,方便记忆. # 设置Shell ...

  9. jqPlot图表插件学习之轴说明和label属性

    一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...

  10. Linux的telent服务

    目前,在Win/Linux下telnet都很少用了,只是因为数据在传输的过程,未加密!不过在Linux下还是多用于端口探测,今天就来回顾曾经的telnet 1.介绍 Linux被广泛运用到各种服务器及 ...