【Android Developers Training】 29. 从Activity获得结果
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/basics/intents/result.html
启动另一个activity不一定是单向的。你也可以启动另一个Activity后,接收它返回的结果。为了接收结果,调用startActivityForResult()(而不是startActivity())。
例如,你的应用可以启动一个相机App,并且接受拍摄的照片作为结果。或者,你可以启动一个“联系人”App来让用户选择一个联系方式,而你将这些联系人的详细信息作为结果接收。
当然,这个响应intent的Activity必须是设计成可以返回一个结果的。当它确实可以时,它会以另一个Intent对象的形式将结果发送回来。你的Activity在onActivityResult()回调函数中接收它。
Note:
当你调用startActivityForResult()时,你可以使用显式地或者隐式的intent。当启动你的一个Activity来接收这个结果时,你应该使用显式地intent来保证你接收了期望的结果。
一). 启动Activity
当你希望启动一个返回结果的Activity时,你使用的Intent对象并没有什么别的特别的地方,但你需要给startActivityForResult()方法传递一个额外的整形参数。
整形参数是一个“需求码(request code)”,用它来标示你的需求。当你接收到装有结果的Intent时,这个回调函数会提供相同的需求码,这样你的应用就可以正确地识别结果来自于哪个需求,进而正确地处理结果。
下面的例子展示的是如何启动一个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);
}
二). 接收结果
当用户在处理Intent的Activity中将事务处理完毕并且返回后,系统将会调用你的Activity的onActivityResult()方法。这个方法包含了三个参数:
- 你传递给startActivityForResult()的需求码。
- 第二个Activity处理后的结果码。如果成功那就是RESULT_OK,如果用户取消了或因为某个原因操作失败了,那就是RESULT_CANCELED。
- 搭载了结果数据的Intent。
下面的例子展示的是如何处理选择一个联系人处理完毕后返回的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request 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 which contact was selected. // Do something with the contact here (bigger example below)
}
}
}
在这个例子中,由Android联系人应用所返回的结果Intent提供了一个内容Uri,它标识出用户所选择的联系人信息。
为了成功处理这个结果,你必须结果Intent中数据的格式是怎么样的。当返回的结果来自于你自己的Acitivity时,处理起来是简单的。而Android内置的应用提供了它们自己的APIs,你可以利用它们获得指定的结果数据。例如,联系人应用返回的一般是标识了选中的联系人信息的内容URI,而相机应用返回的是存储于“data”中的一个Bitmap。(更多信息可以阅读:Capturing Photos)
三). 例子:阅读联系人数据
上面的例子展现了如何从联系人应用获得一个处理结果,但是如何进一步地去处理返回的结果没有继续讨论,因为这一方面的知识需要进一步的研究关于content providers方面的知识。然而,如果你对此感到好奇,下面的例子展示的是如何查询结果数据,进而从选择的联系人信息中得到电话号码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request 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 selected contact
Uri contactUri = data.getData();
// We only need the NUMBER column, because there will be only one row in the result
String[] projection = {Phone.NUMBER}; // Perform the query on the contact to get the 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 be called from a separate thread to avoid blocking
// your app's UI thread. (For simplicity of the 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 the NUMBER column
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column); // Do something with the phone number...
}
}
}
Note:
在Android 2.3(API Level 9)之前,在
Contacts Provider上执行查询(像上面所展现的)需要你的应用申明READ_CONTACTS的授权许可(参考:Security and Permissions)。然而,从Android 2.3开始,联系人应用会授权给你一个临时的权限,当联系人应用向你返回一个结果时,允许你从Contacts Provider中读取信息。但是这个临时权限值仅应用于需要被查询的那个联系人信息,所以你通过intent的Uri查询不到其它联系人信息,除非你申明了READ_CONTACTS的授权许可。
【Android Developers Training】 29. 从Activity获得结果的更多相关文章
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 18. 重新创建一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 17. 停止和重启一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 16. 暂停和恢复一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 15. 启动一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 14. 序言:管理Activity生命周期
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 30. 允许其它应用启动你的Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 27. 序言:和其它应用交互
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 9. 覆盖于布局之上的Action Bar
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- JAVA CyclicBarrier类详解
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrie ...
- (转载)sizeof
[C++专题]C++ sizeof 使用规则及陷阱分析 摘要:鉴于sizeof为各大软件公司笔试.面试必考题,现收集sizeof的各种用法,尽量做到全面理解,其中例子希望能举一反三.提示:下文例子 ...
- 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动用属性:animation-play-state:paused暂停,在微信和safari里设置paused无效,在QQ里是正常的
这几天遇到了两个很奇葩的问题,终于找到原因,趁还记得解决方法,赶紧记下来: 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动可以用属性:animat ...
- 关于ie的h5 刷新和ctrl+5刷新 以及图标刷新的问题
最近在做一个表单验证,当表单失去焦点的时候触发错误提示. 可是..... 火狐 欧朋 刷新都没有问题,而在ie edge 用f5刷新的时候 都能记住之前的焦点 造成提示混乱. 问题算是解决: < ...
- C#基础知识-编程思想之封装(七)
既然是学习面向对象的编程那自然要了解面向对象中的三大基石,封装.继承和多态. 我觉得要解释这三大基本概念用一篇文档很难解释清楚,想要具体形象的去了解,还是需要每一个概念用一个篇幅来说明,将封装.继承和 ...
- Natas Wargame Level 12 Writeup(文件上传漏洞)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAChCAYAAADA86lDAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF
- 用java读写ini配置文件
本文转载地址: http://www.blogjava.net/silvernapoleon/archive/2006/08/07/62222.html import java.io.Bu ...
- Redis Sentinel 机制与用法(二)
概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...
- 第 5 章 MySQL 备份与恢复
第 5 章 MySQL 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 My ...
- UNIX文件I/O
第一次用markdown语法写博客,写出来的还比较整齐,感觉博客园对序号的支持不是很好,调了一会才有了比较满意的效果,还有有哪位知道使用markdown如何插入frame? 这边博客主要说了APUE中 ...