启动另外一个activity,并返回结果

大致步骤: 
1.启动另外一个Activity,这里称子Activity; 
2.子Activity通过setResult方法设置返回结果,setResult方法带两个参数:结果码和表示为Intent的负载值; 
3.父Activity通过onActivityResult方法处理子Activity返回的结果 

让子Activity有返回值 
    
使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会给父Activity提供任何反馈。 
你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父 Activity中的一个事件处理函数。子Activity最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择 一个项目)的场合。 

子Activity的创建和普通Activity的创建相同,也必须在应用程序的manifest中注册。任何在manifest中注册的Activity都可以用作子Activity。 

启动子Activity 

startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID。 

下面的代码显示了如何启动一个子Activity: 

  1. private static final int SHOW_SUBACTIVITY = 1;  
  2.   
  3. Intent intent = new Intent(this, MyOtherActivity.class);  
  4.   
  5. startActivityForResult(intent, SHOW_SUBACTIVITY);  



和正常的Activity一样,子Activity可以隐式或显式启动。下面的框架代码使用一个隐式的Intent来启动一个新的子Activity来挑选一个联系人: 

  1. private static final int PICK_CONTACT_SUBACTIVITY = 2;  
  2.   
  3. Uri uri = Uri.parse(“content://contacts/people”);  
  4.   
  5. Intent intent = new Intent(Intent.ACTION_PICK, uri);  
  6.   
  7. startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);  



返回值 

当子Activity准备关闭时,在finish之前调用setResult来给调用的Activity返回一个结果。 

setResult方法带两个参数:结果码和表示为Intent的负载值。结果码是运行子Activity的结果,一般是 Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情况下,你会希望使用自己的响应代号来处理特定的应用 程序的选择;setResult支持任何整数值。 

作为结果返回的Intent可以包含指向一个内容(例如联系人,电话号码或媒体文件)的URI和一组用来返回额外信息的Extra。 

接下来的代码片段节选自子Activity的onCreate方法,显示了怎样向调用的Activity返回不同的结果: 

  1. Button okButton = (Button) findViewById(R.id.ok_button);  
  2.   
  3. okButton.setOnClickListener(new View.OnClickListener() {  
  4.   
  5. public void onClick(View view)   
  6.   
  7. {  
  8.   
  9. Uri data = Uri.parse(“content://horses/” + selected_horse_id);  
  10.   
  11. Intent result = new Intent(null, data);  
  12.   
  13. result.putExtra(IS_INPUT_CORRECT, inputCorrect);  
  14.   
  15. result.putExtra(SELECTED_PISTOL, selectedPistol);  
  16.   
  17. setResult(RESULT_OK, result);  
  18.   
  19. finish();  
  20.   
  21. }  
  22.   
  23. });  
  24.   
  25. Button cancelButton = (Button) findViewById(R.id.cancel_button);  
  26.   
  27. cancelButton.setOnClickListener(new View.OnClickListener() {  
  28.   
  29. public void onClick(View view)   
  30.   
  31. {  
  32.   
  33. setResult(RESULT_CANCELED, null);  
  34.   
  35. finish();  
  36.   
  37. }  
  38.   
  39. });  





处理子Activity的结果 


当子Activity关闭时,它的父Activity的onActivityResult事件处理函数被触发。 

重写这个方法来处理从子Activity返回的结果。onActivityResult处理器接受好几个参数: 

❑ 请求码 

曾经用来启动子Activity的请求码。 

❑ 结果码 

结果码是由子Activity设置的,用来显示它的结果。它可以是任何整数值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。 

如果子Activity非正常关闭或在关闭时没有指定结果码,结果码都是Activity.RESULT_CANCELED。 

❑ 数据 

一个Intent来打包任何返回的数据。依赖于子Activity的目的,它可能会包含一个代表特殊的从列表中选择的数据的URI。可变通的,或额外的,子Activity可以使用“extras”机制以基础值的方式返回临时信息。 

下面的框架代码实现了一个Activity中的onActivityResult事件处理函数: 

    1. private static final int SHOW_SUB_ACTIVITY_ONE = 1;  
    2.   
    3. private static final int SHOW_SUB_ACTIVITY_TWO = 2;  
    4.   
    5. @Override  
    6.   
    7. public void onActivityResult(int requestCode, int resultCode, Intent data) {  
    8.   
    9. super.onActivityResult(requestCode, resultCode, data);  
    10.   
    11. switch(requestCode)   
    12.   
    13. {  
    14.   
    15. case (SHOW_SUB_ACTIVITY_ONE) :   
    16.   
    17. {  
    18.   
    19. if (resultCode == Activity.RESULT_OK)   
    20.   
    21. {  
    22.   
    23. Uri horse = data.getData();  
    24.   
    25. boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);  
    26.   
    27. String selectedPistol = data.getStringExtra(SELECTED_PISTOL);  
    28.   
    29. }  
    30.   
    31. break;  
    32.   
    33. }  
    34.   
    35. case (SHOW_SUB_ACTIVITY_TWO) :   
    36.   
    37. {  
    38.   
    39. if (resultCode == Activity.RESULT_OK)   
    40.   
    41. {  
    42.   
    43. // TODO: Handle OK click.  
    44.   
    45. }  
    46.   
    47. break;  
    48.   
    49. }  
    50.   
    51. }  
    52.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值