您的位置:首页 > 移动开发 > Android开发

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让用户选择一个联系方式:

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权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐