使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。 可变通的,你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父Activity中的一个事件处理函数。子Activity最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择一个项目)的场合。 子Activity的创建和普通Activity的创建相同,也必须在应用程序的manifest中注册。任何在manifest中注册的Activity都可以用作子Activity。 启动子Activity startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID。 下面的代码显示了如何启动一个子Activity: private static final int SHOW_SUBACTIVITY = 1; Intent intent = new Intent( this, MyOtherActivity. class); startActivityForResult(intent, SHOW_SUBACTIVITY); 和正常的Activity一样,子Activity可以隐式或显式启动。下面的框架代码使用一个隐式的Intent来启动一个新的子Activity来挑选一个联系人: private static final int PICK_CONTACT_SUBACTIVITY = 2; Uri uri = Uri.parse(“content: // contacts/people”); Intent intent = new Intent(Intent.ACTION_PICK, uri); 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返回不同的结果: Button okButton = (Button) findViewById(R.id.ok_button); okButton.setOnClickListener( new View.OnClickListener() { public void onClick(View view) { Uri data = Uri.parse(“content: // horses/” + selected_horse_id); Intent result = new Intent( null, data); result.putExtra(IS_INPUT_CORRECT, inputCorrect); result.putExtra(SELECTED_PISTOL, selectedPistol); setResult(RESULT_OK, result); finish(); } }); Button cancelButton = (Button) findViewById(R.id.cancel_button); cancelButton.setOnClickListener( new View.OnClickListener() { public void onClick(View view) { setResult(RESULT_CANCELED, null); finish(); } }); 处理子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事件处理函数: private static final int SHOW_SUB_ACTIVITY_ONE = 1; private static final int SHOW_SUB_ACTIVITY_TWO = 2; @Override public void onActivityResult( int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (SHOW_SUB_ACTIVITY_ONE) : { if (resultCode == Activity.RESULT_OK) { Uri horse = data.getData(); boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false); String selectedPistol = data.getStringExtra(SELECTED_PISTOL); } break; } case (SHOW_SUB_ACTIVITY_TWO) : { if (resultCode == Activity.RESULT_OK) { // TODO: Handle OK click. } break; } } }
//原文地址:http://www.cnblogs.com/top5/archive/2012/04/09/2439598.html