【Android Developers Training】 29. 从Activi

系统 1666 0

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接: http://developer.android.com/training/basics/intents/result.html


启动另一个activity不一定是单向的。你也可以启动另一个Activity后,接收它返回的结果。为了接收结果,调用 startActivityForResult() (而不是 startActivity() )。

例如,你的应用可以启动一个相机App,并且接受拍摄的照片作为结果。或者,你可以启动一个“联系人”App来让用户选择一个联系方式,而你将这些联系人的详细信息作为结果接收。

当然,这个响应intent的Activity必须是设计成可以返回一个结果的。当它确实可以时,它会以另一个 Intent 对象的形式将结果发送回来。你的Activity在 onActivityResult() 回调函数中接收它。

Note:

当你调用 startActivityForResult() 时,你可以使用显式地或者隐式的intent。当启动你的一个Activity来接收这个结果时,你应该使用显式地intent来保证你接收了期望的结果。

 

一). 启动Activity

当你希望启动一个返回结果的Activity时,你使用的 Intent 对象并没有什么别的特别的地方,但你需要给 startActivityForResult() 方法传递一个额外的整形参数。

整形参数是一个“ 需求码(request code) ”,用它来标示你的需求。当你接收到装有结果的 Intent 时,这个回调函数会提供相同的需求码,这样你的应用就可以正确地识别结果来自于哪个需求,进而正确地处理结果。

下面的例子展示的是如何启动一个Activity,允许用户选择一个联系人:

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

}
      
    

 

 二). 接收结果

当用户在处理Intent的Activity中将事务处理完毕并且返回后,系统将会调用你的Activity的 onActivityResult() 方法。这个方法包含了三个参数:

下面的例子展示的是如何处理选择一个联系人处理完毕后返回的结果:

      
        @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.



            
      
      
        //
      
      
         Do something with the contact here (bigger example below)
      
      
                }

    }

}
      
    

在这个例子中,由Android联系人应用所返回的结果 Intent 提供了一个内容 Uri ,它标识出用户所选择的联系人信息。

为了成功处理这个结果,你必须结果 Intent 中数据的格式是怎么样的。当返回的结果来自于你自己的Acitivity时,处理起来是简单的。而Android内置的应用提供了它们自己的APIs,你可以利用它们获得指定的结果数据。例如,联系人应用返回的一般是标识了选中的联系人信息的内容URI,而相机应用返回的是存储于“ data ”中的一个 Bitmap 。(更多信息可以阅读: Capturing Photos

 

三). 例子:阅读联系人数据

上面的例子展现了如何从联系人应用获得一个处理结果,但是如何进一步地去处理返回的结果没有继续讨论,因为这一方面的知识需要进一步的研究关于 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) {

            
      
      
        //
      
      
         Get the URI that points to the selected contact
      
      

            Uri contactUri =
      
         data.getData();

            
      
      
        //
      
      
         We only need the NUMBER column, because there will be only one row in the result
      
      

            String[] projection =
      
         {Phone.NUMBER};



            
      
      
        //
      
      
         Perform the query on the contact to get the 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 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.)

            
      
      
        //
      
      
         Consider using CursorLoader to perform the query.
      
      

            Cursor cursor =
      
         getContentResolver()

                    .query(contactUri, projection, 
      
      
        null
      
      , 
      
        null
      
      , 
      
        null
      
      
        );

            cursor.moveToFirst();



            
      
      
        //
      
      
         Retrieve the phone number from the NUMBER column
      
      
        int
      
       column =
      
         cursor.getColumnIndex(Phone.NUMBER);

            String number 
      
      =
      
         cursor.getString(column);



            
      
      
        //
      
      
         Do something with the phone number...
      
      
                }

    }

}
      
    

Note:

在Android 2.3(API Level 9)之前,在 Contacts Provider 上执行查询(像上面所展现的)需要你的应用申明 READ_CONTACTS 的授权许可(参考: Security and Permissions )。然而,从 Android 2.3 开始,联系人应用会授权给你一个临时的权限,当联系人应用向你返回一个结果时,允许你从 Contacts Provider 中读取信息。但是这个临时权限值仅应用于需要被查询的那个联系人信息,所以你通过 intent Uri 查询不到其它联系人信息,除非你申明了 READ_CONTACTS 的授权许可。

【Android Developers Training】 29. 从Activity获得结果


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论