跟Google学习Android开发-起始篇-与其它应用程序交互(2)
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)的更多相关文章
- 跟Google学习Android开发-起始篇-与其它应用程序交互(1)
6 与其它应用程序交互 一个Android应用程序通常有多个活动.每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片).为了把用户从一个活动带到另一个,你的应用必须使用Int ...
- 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)
说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)
4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...
- 想学习Android开发
最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...
- android初级应用到高端架构教程------ 完整体系化学习android开发
系统的学习android开发技术,从应用到底层,再到架构,告别乱糟糟的学习方式,不再是抓不住重点.从上到下贯通,全面学习android开发.让你拥有清晰的思路,一步步学习android开发! 一般而言 ...
- Xamarin Android 之起始篇
序言: 在博客园注册了已经有2年多了,快三年了.从开始学习这一行开始就在博客园注册了这个账号.至今也还没有写过一篇随笔,大多时候都是在园子里头潜水,看大牛写的文章,学习. 写博客不为啥,就是自己对自己 ...
- 站在巨人的肩膀上学习Android开发
我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...
- 新人学习Android开发遇到的小问题总结
1. IDE搭建: 搭建android的IDE时,先注意是什么版本的系统,64/32位系统. 通常使用的是Eclipse for android,Android Studio由于还需要FQ,网速慢,所 ...
- 10个学习Android开发的网站推荐
1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会. 2. Android Gui ...
随机推荐
- svn密码问题
官方书籍version control with svn提到了这个问题: Disabling Password Caching When you perform a Subversion operat ...
- oschina iOS代码库
iOS代码库 34Activity 54下拉刷新(pull-to-refresh) 143菜单 (Menu) 20位置信息(GPS/Location) 24iOS 表单 74提醒 (Notificat ...
- kvm libvirt: hostdev passthrough support 解决加密狗冲突问题
From: "Daniel P. Berrange" <berrange redhat com> To: Guido Günther <agx sigxcpu o ...
- shu_1548 悟空问题(大哥,主妖怪抓走的朋友!)
http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=17 分析: 直接暴力了.. . 代码: #include <s ...
- 问题在哪?动态菜单条-------Day86
今天做了一个动态菜单条,先上图片,简单说一下我想实现的效果: 就是以下这个地方,随着鼠标指到哪,它就划到哪,并有一个惯性的幅度,并且滑动距离越远,停住的时候惯性越大,摆动幅度越大,这就是我大概想实现的 ...
- 解析stm32的时钟
STM32 时钟系统 http://blog.chinaunix.net/uid-24219701-id-4081961.html STM32的时钟系统 *** http://www.cnblo ...
- JVM--常见的虚拟机回收算法
Serial GC -XX:+UseSerialGC 这样就设置为了串行GC回收方式,这种方式在Client模式下是默认的. 一般是使用在单机程序,小内存,CPU个数少的机器上. 没有复杂的算法,只用 ...
- xp对opengl的支持问题
我在项目中遇到的xp显示问题是因为xp对opengl的支持问题,是通过void QCoreApplication::setAttribute(Qt::ApplicationAttribute attr ...
- FireMonkey下的异形窗体拖动(句柄转换)
DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...
- oracle事务和锁(转)
If you use a SET TRANSACTION statement, then it must be the first statement in your transaction. How ...