与其他应用交互(2)——从Activity接收结果

https://developer.android.google.cn/training/basics/intents/result.html

如果想要启动另一个Activity并且接收返回结果,使用 startActivityForResult() 来代替 startActivity()

当然,响应的Activity也必须被设计的能返回结果。可以的话,就能把结果作为另一个intent对象发送过来。你的Activity就能在 onActivityResult() 里面调用。

注意:你可以用显式或隐式intent调用 startActivityForResult(). 当启动了一个你自己的Activity来接收结果的时候,你应该使用显式intent来确保你接收到了预期的结果。

启动Activity

你用来启动Activity来接收结果的Intent对象没什么特别的,只是你需要传递一个额外的整型参数给 startActivityForResult() 方法。

这个整型参数是一个定义了你的请求的“请求代码”。当你接收到结果Intent,回调同时也提供了一样的请求代码让你的App能够正确的识别结果并且决定如何处理它。

举例如下,如何启动一个允许用户选择一个联系人的Activity:

1 static final int PICK_CONTACT_REQUEST = 1;  // The request code
2 ...
3 private void pickContact() {
4     Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
5     pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
6     startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
7 }

 

 接收结果

当用户已经用完了随后的Activity和结果,系统会调用你的Activity的 onActiviyResult() 方法。这个方法包括了三个参数:

你传递给 startActivityForResult() 的请求代码

第二个Activity规定的请求代码。如果操作成功则返回RESULT_OK,如果用户取消了或者因为其他原因操作失败了,则返回RESULT_CANCELED.

一个包含了结果数据的Intent.

举例如下,这是处理“选择一个联系人”Intent的结果:

 1 @Override
 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3     // Check which request we're responding to
 4     if (requestCode == PICK_CONTACT_REQUEST) {
 5         // Make sure the request was successful
 6         if (resultCode == RESULT_OK) {
 7             // The user picked a contact.
 8             // The Intent's data Uri identifies which contact was selected.
 9 
10             // Do something with the contact here (bigger example below)
11         }
12     }
13 }

 

 在这个示例里,结果Intent返回了由Android联系人或者人脉app提供的一个指定了用户选择的联系人的内容Uri.

为了能成功处理结果,你必须了解结果Intent将由何种格式构成。在这个过程中,当Activity返回了一个由你自己Activity返回的结果时非常简单。App包含了由Android平台提供的它们自己的API,你可以指望它们来获得具体的结果数据。比如说,人脉App永远返回一个识别了被选择的联系人的内容URI结果,照相App返回一个 Bitmap 对象在“数据”额外信息里。

读取联系人数据

上面的代码显示了如何从不用真正的从结果中读取数据就能从人脉App中获取结果,因为这需要讨论更多关于内容提供器的高级技巧。但是,如果你很好奇的话,这里有一些代码显示了如何查询结果数据来获取所选择的联系人的电话号码:

 1 @Override
 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3     // Check which request it is that we're responding to
 4     if (requestCode == PICK_CONTACT_REQUEST) {
 5         // Make sure the request was successful
 6         if (resultCode == RESULT_OK) {
 7             // Get the URI that points to the selected contact
 8             Uri contactUri = data.getData();
 9             // We only need the NUMBER column, because there will be only one row in the result
10             String[] projection = {Phone.NUMBER};
11 
12             // Perform the query on the contact to get the NUMBER column
13             // We don't need a selection or sort order (there's only one result for the given URI)
14             // CAUTION: The query() method should be called from a separate thread to avoid blocking
15             // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
16             // Consider using CursorLoader to perform the query.
17             Cursor cursor = getContentResolver()
18                     .query(contactUri, projection, null, null, null);
19             cursor.moveToFirst();
20 
21             // Retrieve the phone number from the NUMBER column
22             int column = cursor.getColumnIndex(Phone.NUMBER);
23             String number = cursor.getString(column);
24 
25             // Do something with the phone number...
26         }
27     }
28 }

 

  •  注意:在Android 2.3之前(API level 9),在联系人提供器中执行查询操作小你的app声明了READ_CONTACTS 权限。但是,从Android 2.3起,当联系人提供器返回结果时,联系人/人脉 App 会授予你的App一个临时的权限来从里面读取数据。临时的权限仅应用于被指定请求的联系人,所以你不能使用intent的Uri查询除你指定之外的联系人,除非你声明了READ_CONTACTS 权限。

 

posted @ 2017-08-09 13:46  Kevinzh64  阅读(123)  评论(0)    收藏  举报