启用另一个activity不一定是单向的。也可以启用另一个activity并且获得返回值。要获得返回值的话,调用startActivityForResult()(而不是startActivity())。

比如,app可以打开相机然后接收一张照片作为返回值。或者,为了让用户选择一个联系人可以让用户启动联系人相关app,然后收到联系人详情作为结果。

当然,这个响应的activity必须设计为有返回值的。当返回的时候,它用Intent对象作为返回值。activity会在onActivityResult()回调方法中收到。

注意:用明确的和模糊的intent都可以使用startActivityForResult()。当使用自己的activity来接收结果时,需要使用一个明确的intent来保证你可以收到结果。

开始一个Activity

当启动一个activity来获取返回值时Intent对象没有什么特别的,但是需要另外传递一个integer参数给startActivityForResult()方法。

这个integer参数是一个"request code",用来标识请求。当收到Intent结果,回调时会返回同样的"request code"这样app可以很好的识别结果和决定如何处理它。

例如,这里有一个如何启动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);
}

接收返回值

当用户完成了后来activity中的操作并且返回时,系统会调用activity的onActivityResult()方法。这个方法包含三个参数:

  • 在startActivityForResult()中传递的请求码。
  • 第二个activity的返回码。它会时RESULT_OK如果操作成功,或者RESULT_CANCELED如果用户退回去或者操作由于某些原因失败。
  • 一个带有结果数据的Intent

例如,这里是如何处理选择联系人的返回值:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 检查返回的结果
if (requestCode == PICK_CONTACT_REQUEST) {
// 确保请求成功了
if (resultCode == RESULT_OK) {
// 用户选择了一个联系人
// Intent的数据Uri标识了联系人被选中了 // 用这个联系人做点什么(下面会有示例)
}
}
}

这个例子中,由Android联系人或其他联系人相关app返回的Intent提供了一个Uri可以标识用户选择了哪个联系人。

为了成功的处理结果,必须要了解返回的Intent的格式是什么样的。当返回值的activity是自己的activity时处理起来很简单。Android平台自带的app,对于这些结果可以根据他们提供的API来处理。例如,联系人app总是返回一个content URI来标识选中的联系人,相机app在附加数据中返回一个Bitmap(可以在Capturing Photos中查看)。

附加:读取联系人数据

上面的代码展示了如何从联系人app中获得结果但是没有详细的展示如何读结果数据,因为需要更多的关于content providers的探讨。然而,如果你好奇的话,这里由一些代码展示了如果从选择的联系人中获得电话号码:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 查看返回的是哪个请求
if (requestCode == PICK_CONTACT_REQUEST) {
// 确保请求成功了
if (resultCode == RESULT_OK) {
// 获得指向选中联系人的URI
Uri contactUri = data.getData();
// 我们只需要NUMBER列,因为结果中只有一行
String[] projection = {Phone.NUMBER}; // 在联系人上执行查询来获得NUMBER列
// 我们不需要选择排序方法(只有一个结果)
// 注意:query()应该在另外一个线程调用,为了避免阻塞app的UI线程。(为了简单,这里就不那么做了)
// 用CursorLoader来执行查询
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst(); //从NUMBER列获得电话号码
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column); //用电话号码所点什么
}
}
}

注意:在Android2.3(API等级9)之前,使用Contracts Provider(就像上面展示的)来查询需要app声明READ_CONTACTS权限(查看Security and Permissions)。然后,从Android2.3开始,联系人app允许app用临时权限来用Contacts Provider获得结果。这个临时权限只适用于明确的联系人请求,所以除非是由intent的Uri明确指定的联系人,其他的都不能查询,或者可以声明READ_CONTACTS权限。

上一篇:Android - 和其他APP交互 - 把用户带到其他APP

下一篇:Android - 和其他APP交互 - 让其他APP启动你的Activity

Android - 和其他APP交互 - 获得activity的返回值的更多相关文章

  1. Android - 和其他APP交互 - 把用户带到其他app

    Android的重要功能之一就是app可以根据要执行的操作让用户启动另外一个app.例如,app有一个商业地址然后想要在地图上显示,并不需要在app中加一个显示地图的activity,可以直接用Int ...

  2. Android - 和其他APP交互

    一个Android app通常有好几个activity.每个activity显示一个可以让用户执行特殊操作(例如看地图,照相等)的界面.要让用户从一个activity切换到另一个activity,ap ...

  3. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  4. activity 接回返回值

    activity 接回返回值 今天做订单列表显示 点击某一项显示订单详细信息,在详细activity中用户可以选择取消订单(未支付的状态下)当用户取消订单后订单列表也要改变状态,原来最初做法是所加载绑 ...

  5. Android - 和其他APP交互 - 让其他app启动你的activity

    前面的两篇文章主要讲了一个方面:从app中启动其他app.但是如果你的app可以处理对其他app有用的操作,你的app也应该响应其他app的操作请求.例如,如果你创建了一个社交app可以分享信息和图片 ...

  6. Android课程---Activity 带返回值的跳转

    Activity2.java package com.hanqi.test4; import android.content.Intent; import android.os.Bundle; imp ...

  7. phonegap android插件,启动activity并返回值

    Your execute menthod is not quite right. When you do: return new PluginResult(PluginResult.Status.OK ...

  8. Android学习笔记(一)——Activity简介 和 View

    源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...

  9. Android Webview 和Javascript交互,实现Android和JavaScript相互调用

    在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...

随机推荐

  1. Enum实现单例模式

    package com.wjy.effective; public enum Singleton { INSTANCE; private int numa; private int numb; pub ...

  2. Python 收集Twitter时间序列数据

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-18 @author: guaguastd @name: c ...

  3. python手记(48)

    #!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com imp ...

  4. cocos2d-x ndk adt mac 路径配置

    export PATH=/bin:/sbin:/usr/local/mysql/bin export PATH=$PATH:/Applications/MacVim-snapshot-68 expor ...

  5. HDU2586 How far away ?(LCA模板题)

    题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...

  6. poj2942 Knights of the Round Table,无向图点双联通,二分图判定

    点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...

  7. windows phone 加速计(5)

    原文:windows phone 加速计(5) 在windows phone 中存在着加速计,我们可以利用加速计获得用户手机的状态,根据手机状态调整我们的程序,这样会更人性化:windows phon ...

  8. EXE文件结构和读取方法

    一.EXE文件概念 EXE File英文全名executable file .译作可运行文件,可移植可运行 (PE) 文件格式的文件,它能够载入到内存中.并由操作系统载入程序运行,是可在操作系统存储空 ...

  9. HDU 4982 Goffi and Squary Partition(推理)

    HDU 4982 Goffi and Squary Partition 思路:直接从全然平方数往下找,然后推断是否能构造出该全然平方数,假设能够就是yes,假设都不行就是no.注意构造时候的推断,因为 ...

  10. The app references non-public selectors in payload With Xcode6.1

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: p=591" style="color: rgb(255, 97, 0 ...