Android Developers:从一个Activity获取结果_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android Developers:从一个Activity获取结果

Android Developers:从一个Activity获取结果

 2013/11/3 13:16:31  安卓吧  博客园  我要评论(0)
  • 摘要:启动其它Activity不是单向的。你也能启动其它Activity并获取一个返回结果。为了获取一个结果,调用startActivityForResult()方法(替代startActivity()方法)。例如,你的应用程序能启动一个照相机应用程序,并获取捕捉的相片作为结果。或者,你可能启动People应用程序,为了用户选择一个联系人,并且你将会获取这个联系的的详细信息作为结果。当然,这个响应Activity必须被设计来返回一个结果。当它执行的时候,它发送这个结果作为其它Intent对象
  • 标签:android Developer 一个 结果 Activity

class="Paragraph SCX125147398">启动其它Activity不是单向的。你也能启动其它Activity并获取一个返回结果。为了获取一个结果,调用startActivityForResult()方法(替代startActivity()方法)。 

 

例如,你的应用程序能启动一个照相机应用程序,并获取捕捉的相片作为结果。或者,你可能启动People应用程序,为了用户选择一个联系人,并且你将会获取这个联系的的详细信息作为结果。 

 

当然,这个响应Activity必须被设计来返回一个结果。当它执行的时候,它发送这个结果作为其它Intent对象。你的Activity在onActivityResult()回调方法中获取它。 

 

注意:你能使用显示的或者隐式的意图,当你调用startActivityForResult()方法的时候。当启动一个你自己的Activity来获取一个结果的时候,你应该使用一个明确的意图来确保你获取获取期望的结果。 

 

启动Activity 

—————————————————————————————————————————————————————————————— 

当你启动一个Activity返回结果的时候,这里没有指定关于你使用Intent对象的任何事情,但是你需要传递一个额外的整型参数给startActivityForResult()方法。 

 

这个整型参数是一个“请求码“,他确定你的请求。但你获取这个结果Intent的时候,回调方法提供了相同的访问码,以至于你的应用程序能正确的识别这个结果,并决定如何处理它。 

 

例如,这里是如何启动一个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, new Uri("content://contacts"));   
  5.     pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers   
  6.     startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);   
  7. }   

 

 

获取结果 

——————————————————————————————————————————————————————————————

当用户处理了后来的Activity并返回的时候,系统调用你的Activty的onActivityResult()方法。这个方法包含三个参数: 

  • 你传递给startActivityForResult()方法的请求码。 

  • 被第二个Activity指定的结果码。这个是RESULT_OK如果操作成功,或者RESULT_CANCLED如果用户返回或者操作由于一些原因失败。 

  • 携带结果码的一个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通过Andrid的Contacts或者People应用程序提供一个内容Uri被返回,它确定用户选择的联系人。 

 

为了成功的处理这个结果,你必须懂得结果Intent的格式。当Activity返回的结果是一个你自己的Activity的时候是非常简单的。包含在Android平台中的应用程序支持你能指定特定结果数据的API。例如,People应用程序(联系人应用程序在一些老的版本)总是返回一个结果,伴随着content URI,它指定了被选择的联系人,并且Camera应用程序在”data”额外数据中返回一个Bitmap(查看关于Capturing Photos的课程)。 

 

额外:读取联系人数据 

上面显示的如何从People应用程序获取一个结果的代码,没有关于如何从这个结果中读取数据的详细说明,因为它需要在content provider中需要更详细的讨论。然而,如果你很好奇,这里有一些代码,它展示了如何查询从选择额联系人获取电话号码结果数据: 

 
  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, nullnullnull);   
  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. }   
 

 

注意:在Andrid2.3之前(API Level 9),在这个Content Provider中执行一个查询(想上上面显示的)要求你的应用程序声明READ_CONTACTS权限(查看Security and Permissions)。然而,从Android2.3开始,Contacts/People应用程序授予应用程序临时的权限,当它返回你一个结果的时候读取联系人Provider。这个临时的权限仅仅应用给指定的联系人请求,所以你不能查询一个其它联系人,除了通过Intent的Uri被指定,至少你要声明READ_CONTACTS权限。

发表评论
用户名: 匿名