Google Android开发者文档系列-与其他应用程序交互之获取Activity返回的结果

原创 2016年05月31日 16:29:45

Getting a Result from an Activity(获取活动中返回的结果)

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能错译的误区。在此感谢http://android.xsoftlab.net/提供的镜像,希望转载者注明出处http://blog.csdn.net/u014031072/article/details/51546902方便查看最新博客

Starting another activity doesn’t have to be one-way. You can also start another activity and receive a result back. To receive a result, call startActivityForResult() (instead of startActivity()).
启动另一个活动并不总是单向的。您也可以启动另一个活动,并接收一个返回结果。要接收结果,则调用startActivityForResult()(而不是startActivity())。

For example, your app can start a camera app and receive the captured photo as a result. Or, you might start the People app in order for the user to select a contact and you’ll receive the contact details as a result.
例如,您的应用程序可以启动相机应用,并接收捕获的照片作为结果。或者,你可能会启动联系人应用让用户选择一个联系人,并将收到的联系方式作为返回结果。

Of course, the activity that responds must be designed to return a result. When it does, it sends the result as another Intent object. Your activity receives it in the onActivityResult() callback.
当然,作出响应的活动界面必须设置一个返回结果。当它设置好后,它会将设置的结果作为另一个intent(意图)对象发送回来。您的活动界面将会在它的onActivityResult()回调方法里面接收到返回的结果。

Note: You can use explicit or implicit intents when you call startActivityForResult(). When starting one of your own activities to receive a result, you should use an explicit intent to ensure that you receive the expected result.
注意:当你调用startActivityForResult()方法时可以使用显式或者隐式intent,当你启动一个自己的活动界面去接收一个返回结果时,你应该使用一个显式来确保你将接收到所期望的返回值。

Start the Activity(启动活动)

There’s nothing special about the Intent object you use when starting an activity for a result, but you do need to pass an additional integer argument to the startActivityForResult() method.
当你启动并接受一个返回结果时所传递的intent并没有什么特殊的地方,但是你必须传递一个额外的整型参数给startActivityForResult()方法。

The integer argument is a “request code” that identifies your request. When you receive the result Intent, the callback provides the same request code so that your app can properly identify the result and determine how to handle it.
这个整型参数是一个用来标识你的请求的“request code(请求码)”,当你接收到返回的intent结果时,回调提供了相同的请求码,从而你的应用程序能够正确的识别这个返回结果并决定如何去操作它。

For example, here’s how to start an activity that allows the user to pick a contact:
例如:下面如何启动一个活动并允许用户选择一个联系人:

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);
}

Receive the Result(获取返回的结果)

When the user is done with the subsequent activity and returns, the system calls your activity’s onActivityResult() method. This method includes three arguments:
当用户完成这一连串的(启动)活动和(设置)返回结果事物后,系统会调用你的活动界面的onActivityResult()方法。这个方法包含三个参数:

1.The request code you passed to startActivityForResult().
1.你传递给startActivityForResult()方法的请求码。

2.A result code specified by the second activity. This is either RESULT_OK if the operation was successful or RESULT_CANCELED if the user backed out or the operation failed for some reason.
2.一个由第二个活动界面(被启动的活动界面)定义的结果码。当操作成功时它的值为RESULT_OK ,当用户退出或者操作因为某些原因失败时它的值为RESULT_CANCELED。

3.An Intent that carries the result data.
3.一个包含返回结果的intent

For example, here’s how you can handle the result for the “pick a contact” intent:
例如,下面是如何操作选择联系人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.
            //intent的Uri数据标识了哪个联系人被选中了
            // Do something with the contact here (bigger example below)
            //处理选择的联系人信息(在下面的例子中)
        }
    }
}

In this example, the result Intent returned by Android’s Contacts or People app provides a content Uri that identifies the contact the user selected.

在这个例子中,由Android的联系人或者联系人应用程序返回的结果intent提供了一个Uri内容来标识被用户选中的联系人

In order to successfully handle the result, you must understand what the format of the result Intent will be. Doing so is easy when the activity returning a result is one of your own activities. Apps included with the Android platform offer their own APIs that you can count on for specific result data. For instance, the People app (Contacts app on some older versions) always returns a result with the content URI that identifies the selected contact, and the Camera app returns a Bitmap in the “data” extra (see the class about Capturing Photos).
为了成功的操作返回的结果,你必须理解返回的结果intent的数据格式。当设置返回结果的活动界面是由你自己定义的时,就很容易了。当设置返回结果的活动界面是Android平台自己的API提供的时,你将会获得特定格式的结果数据。比如,联系人应用程序(一些老版本的联系人应用程序)总会返回一个URI结果来标识被选中的联系人,相机应用会在intent的额外数据“data”中返回一个Bitmap数据(查看捕捉照片类)。

Bonus: Read the contact data(额外的:读取联系人数据)

The code above showing how to get a result from the People app doesn’t go into details about how to actually read the data from the result, because it requires more advanced discussion about content providers. However, if you’re curious, here’s some more code that shows how to query the result data to get the phone number from the selected contact:
上面的代码展示了如何从联系人应用中获取返回结果,但并没有详细的展示如何真正的去读取返回结果中的数据,因为这将需要进一步的关于内容提供者的讨论(因为这将需要提前讨论到内容提供者的知识)。但是,如果你感到好奇,下面是一些额外的代码展示了如何从返回结果中查询得到被选中联系人的手机号:

@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
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            //我们只需要NUMBER列的数据,因为结果只有一行
            String[] projection = {Phone.NUMBER};
            // Perform the query on the contact to get the NUMBER column
            //从联系人中查询NUMBER列的数据
            // We don't need a selection or sort order (there's only one result for the given URI)
            //我们不需要选择或者排序(得到的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.)
              //注意:query()方法应该在单独的线程中调用,以防止程序阻塞应用程序的UI线程(为了代码样本的简单性,此段代码没做到这点。)
            // Consider using CursorLoader to perform the query.
            //考虑使用CursorLoader执行查询。
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();
            // Retrieve the phone number from the NUMBER column
            //从NUMBER列检索手机号数据
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);
            // Do something with the phone number...
            //操作手机号码信息
        }
    }
}

Note: Before Android 2.3 (API level 9), performing a query on the Contacts Provider (like the one shown above) requires that your app declare the READ_CONTACTS permission (see Security and Permissions). However, beginning with Android 2.3, the Contacts/People app grants your app a temporary permission to read from the Contacts Provider when it returns you a result. The temporary permission applies only to the specific contact requested, so you cannot query a contact other than the one specified by the intent’s Uri, unless you do declare the READ_CONTACTS permission.
注:Android 2.3的(API9级)之前,在联系人提供者中执行查询操作(如上面所示)要求您的应用程序声明READ_CONTACTS权限(请参见安全和权限)。然而,从Android2.3开始,你的应用程序读取联系人提供者的数据,当它返回一个结果时联系人应用程序准予你的应用程序一个临时许可。临时许可只适用于特定的联系人请求,所以你不能查询intent(意图)的URI指定的联系人之外的联系人,除非你声明了READ_CONTACTS权限。

相关文章推荐

Google Android开发者文档系列-与其他应用程序交互(序言)

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之发送简单数据到其它应用程序

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之接收其它应用程序发送的简单数据

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之获取文件信息

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之请求共享文件

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之共享文件

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之文件共享(序言)

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-创建有内容分享特性的应用之添加一个简单的共享action

该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有限,所以内容包含原文和译文,希望浏览者结合理解,以免步入我可能...

Google Android开发者文档系列-开发企业App

Building Apps for Work(开发企业App)该系列文章是我在学习Google开发者文档时结合谷歌翻译和自身理解编写的,希望对学习Android开发的朋友带来些便利,由于个人翻译水平有...

跟Google学习Android开发-起始篇-与其它应用程序交互(2)

6.2从活动获取结果 启动另一个活动不必是单向的。您也可以启动另一个活动,并接收一个结果回来。为了接收一个结果,调用startActivityForResult()(而不是startActi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Google Android开发者文档系列-与其他应用程序交互之获取Activity返回的结果
举报原因:
原因补充:

(最多只允许输入30个字)