Android Training - 和其他程序交互(2) - 从一个activity取得结果
2012-08-15 21:08
381 查看
启动另外一个activity的方法不止一种,你也可以启动一个activity并从这个activity取得一个返回的结果,使用startActivityForResult()代替startActivity()可以实现。
例如,你的程序可以启动一个照相机然后取得相片做为结果。或者,你可以启动一个联系人程序,然后选择一个联系方式做为结果。
当然,响应的activity必须被设计成能返回一个结果,它通过另外一个intent发送结果,你使用onActivityResult()接收结果。
提示:当你调用startActivityForResult()时可以使用显式或者隐式的intent。但是接收返回的结果时,你需要使用一个显式的intent,以确保你能接收期望的结果。
启动Activity
启动一个可以返回结果的activity的intent对象没什么特别要求,但是你需要传递一个附加的整形参数给startActivityForResult()函数。
这个整形参数是一个“请求代码”,它指定了你的请求。当你接收结果Intent时,回调提供相同的请求代码以便你的程序可以正确匹配结果,确定怎么处理结果。
例如,下面是启动activity让用户选择一个联系方式:
接收结果
当用户从后面的activity返回时,系统调用你的activity的onActivityResult()函数,这个函数包含3个参数:
请求代码,就是你传递给startActivityForResult()的。
结果代码,由第二个activity指定,操作成功就返回RESULT_OK,如果用户返回,或者操作错误就返回RESULT_CANCELED。
携带数据的Intent。
例如,下面代码展示了如果处理”挑选联系方式“的结果:
这个例子中,返回的Intent由Android联系人或者联系人程序提供一个Uri内容,指定了哪个联系人被选择。
为了成功处理结果,你必须知道结果是什么格式的数据。在你自己activity中返回固定格式的结果很简单。Android平台包含的程序提供了自己的API,可以返回你期望的结果数据。例如,联系人程序通常返回一个URI内容,它指定了你选择的联系人。照相机程序返回一个位图在附加数据中。
附加知识:读取联系人数据
上面的代码说了怎么取得一个返回结果,但是没有说怎么读取这些结果数据,因为这涉及到一些更高级的讨论,是关于content providers的。如果你好奇的话,下面这些代码展示了如何从选择的联系人中取得电话号码:
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
// 从NUMBER列检索电话号码
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
// 用电话号码做一些什么...
}
}
}[/code]
提示:在Android2.3前,要在Contacts Provider上执行查询,你需要声明READ_CONTACTS权限。从Android2.3开始,当Contacts Provider返回一个结果时,联系人程序会给予你的程序一个临时读取权限。这个权限仅仅适用于一些特别的联系人请求,所以除了一个指定意图的Uri,你不能请求一个练习人,除非你声明READ_CONTACTS权限。
例如,你的程序可以启动一个照相机然后取得相片做为结果。或者,你可以启动一个联系人程序,然后选择一个联系方式做为结果。
当然,响应的activity必须被设计成能返回一个结果,它通过另外一个intent发送结果,你使用onActivityResult()接收结果。
提示:当你调用startActivityForResult()时可以使用显式或者隐式的intent。但是接收返回的结果时,你需要使用一个显式的intent,以确保你能接收期望的结果。
启动Activity
启动一个可以返回结果的activity的intent对象没什么特别要求,但是你需要传递一个附加的整形参数给startActivityForResult()函数。
这个整形参数是一个“请求代码”,它指定了你的请求。当你接收结果Intent时,回调提供相同的请求代码以便你的程序可以正确匹配结果,确定怎么处理结果。
例如,下面是启动activity让用户选择一个联系方式:
static final int PICK_CONTACT_REQUEST = 1; // 请求代码 ... private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, new Uri("content://contacts")); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); }
接收结果
当用户从后面的activity返回时,系统调用你的activity的onActivityResult()函数,这个函数包含3个参数:
请求代码,就是你传递给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数据指定了哪个联系人被选择。 // 利用这个联系方式做点什么吧 } } }
这个例子中,返回的Intent由Android联系人或者联系人程序提供一个Uri内容,指定了哪个联系人被选择。
为了成功处理结果,你必须知道结果是什么格式的数据。在你自己activity中返回固定格式的结果很简单。Android平台包含的程序提供了自己的API,可以返回你期望的结果数据。例如,联系人程序通常返回一个URI内容,它指定了你选择的联系人。照相机程序返回一个位图在附加数据中。
附加知识:读取联系人数据
上面的代码说了怎么取得一个返回结果,但是没有说怎么读取这些结果数据,因为这涉及到一些更高级的讨论,是关于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) { // 取得选择的联系人的URI Uri contactUri = data.getData(); // 你仅仅需要一个号码列,因为只有一行数据。 String[] projection = {Phone.NUMBER}; // 从联系人中查询电话号码列 // 我们不需要挑选和排序,因为取得的URI只有一个结果 // 警告:query()函数需要从一个单独的线程被呼叫,以避免阻塞UI线程(这个例子没有做到)。 // 使用[code]CursorLoader执行查询.
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
// 从NUMBER列检索电话号码
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
// 用电话号码做一些什么...
}
}
}[/code]
提示:在Android2.3前,要在Contacts Provider上执行查询,你需要声明READ_CONTACTS权限。从Android2.3开始,当Contacts Provider返回一个结果时,联系人程序会给予你的程序一个临时读取权限。这个权限仅仅适用于一些特别的联系人请求,所以除了一个指定意图的Uri,你不能请求一个练习人,除非你声明READ_CONTACTS权限。
相关文章推荐
- Android Training - 和其他程序交互(3) - 允许其他程序启动你的activity
- 【Android Training - 05】与其他Apps进行交互 [ Lesson 2 - 从activity获取Result ]
- Android Training - 和其他程序交互
- Android Training - 和其他程序交互(1) - 发送用户请求给另外一个程序
- Android官方开发文档Training系列课程中文版:与其它APP交互之从Activity获得结果
- 【Android Training - 05】与其他Apps进行交互 [ Lesson 3 - 允许其他app启动你的activity ]
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- 和其他App交互(2)从一个Activity中得到结果
- Training--与其他APP通信(2)--从一个Activity得到结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android——如何从一个activity中退出程序
- Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity
- Android Developers:从一个Activity获取结果
- Android - 和其他APP交互 - 让其他app启动你的activity
- android 与其他程序交互(一)
- android定义可以被其他程序调用的activity
- Google Android开发者文档系列-与其他应用程序交互之允许其他应用启动你的Activity
- Android问题集锦之八:调用其他程序中的activity和Permission Denial: starting Intent 错误解决办法