Android 从另一个活动获得结果
示例
通过使用,startActivityForResult(Intentintent,intrequestCode)您可以启动另一个对象Activity,然后从Activity该onActivityResult(intrequestCode,intresultCode,Intentdata)方法中接收结果。结果将作为返回Intent。意图可以通过捆绑包包含数据
在此示例中,MainActivity将启动一个DetailActivity,然后从中期望结果。每种请求类型都应具有自己的int请求代码,以便在中的重写onActivityResult(intrequestCode,intresultCode,Intentdata)方法中MainActivity,可以通过比较requestCode和的 值来确定要处理的请求REQUEST_CODE_EXAMPLE(尽管在此示例中只有一个)。
主要活动:
public class MainActivity extends Activity { //针对每个用例使用唯一的请求代码 private static final int REQUEST_CODE_EXAMPLE = 0x9345; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建一个新的Intent实例以启动DetailActivity final Intent intent = new Intent(this, DetailActivity.class); //使用请求代码启动DetailActivity startActivityForResult(intent, REQUEST_CODE_EXAMPLE); } //onActivityResult仅被调用 //当其他活动先前使用startActivityForResult开始时 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //首先,我们需要检查requestCode是否与我们使用的匹配。 if(requestCode == REQUEST_CODE_EXAMPLE) { //resultCode由DetailActivity设置 //按照惯例RESULT_OK表示无论 //DetailActivity做到了成功执行 if(resultCode == Activity.RESULT_OK) { //从返回的Intent中获取结果 final String result = data.getStringExtra(DetailActivity.EXTRA_DATA); //使用数据-在这种情况下,将其显示在Toast中。 Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show(); } else { //setResult未由DetailActivity成功执行 //由于某些错误或控制流程。没有数据可检索。 } } } }
DetailActivity:
public class DetailActivity extends Activity { //用于标识活动之间发送的数据的常数。 public static final String EXTRA_DATA = "EXTRA_DATA"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); final Button button = (Button) findViewById(R.id.button); //单击此按钮后,我们要返回结果 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //创建一个新的Intent对象作为结果的容器 final Intent data = new Intent(); //添加所需的数据以返回到MainActivity data.putExtra(EXTRA_DATA, "一些有趣的数据!"); //将resultCode设置为Activity.RESULT_OKto //表示成功并附加意图 //包含我们的结果数据 setResult(Activity.RESULT_OK, data); //使用finish()我们将DetailActivity关闭为 //回到MainActivity finish(); } }); } @Override public void onBackPressed() { //当用户点击后退按钮时,设置resultCode //asActivity.RESULT_CANCELED指示失败 setResult(Activity.RESULT_CANCELED); super.onBackPressed(); } }
您需要注意的几件事:
仅在您致电后才返回数据finish()。您需要在致电setResult()之前先致电finish(),否则将不会返回任何结果。
确保您Activity没有使用android:launchMode="singleTask",否则它将导致Activity单独运行一个任务,因此您不会收到结果。如果您Activity将其singleTask用作启动模式,它将onActivityResult()立即以结果代码调用Activity.RESULT_CANCELED。
使用时要小心android:launchMode="singleInstance"。在Lollipop之前的设备(Android5.0,API级别21)上,“活动”将不会返回结果。
调用时可以使用显式或隐式意图startActivityForResult()。在开始自己的活动之一以接收结果时,应使用明确的意图来确保收到预期的结果。显式intent总是传递到其目标,无论其包含什么内容;在filter没有咨询。但是,仅当隐式意图可以通过组件的筛选器之一时,才会传递给它。