返回

剖析Activity之setResult工作原理,揭秘数据回传过程

Android

ActivityResult 机制概述

在Android开发中,startActivityForResult()方法是启动Activity并从被启动的Activity接收结果的常用方法。当您调用startActivityForResult()方法时,系统会创建一个新的Activity实例,并将请求代码(requestCode)和Intent对象作为参数传递给它。

当被启动的Activity销毁时,它可以使用setResult()方法将结果数据回传给启动它的Activity。setResult()方法有两个参数:resultCode和Intent对象。resultCode是一个整数,用于指示结果的状态。Intent对象用于携带结果数据。

setResult() 方法的详细分析

1. 语法结构

public void setResult(int resultCode, Intent data)

2. 参数说明

  • resultCode :结果状态代码。可以是RESULT_OK、RESULT_CANCELED或任何自定义的代码。
  • data :Intent对象,用于携带结果数据。

3. 工作原理

当您调用setResult()方法时,系统会将resultCode和Intent对象存储在被启动的Activity的ResultInfo对象中。当被启动的Activity销毁时,系统会将ResultInfo对象传递给启动它的Activity。

启动Activity可以通过onActivityResult()方法获取ResultInfo对象,从而获取resultCode和Intent对象。onActivityResult()方法的签名如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
  • requestCode :与startActivityForResult()方法中指定的requestCode相对应。
  • resultCode :与setResult()方法中指定的resultCode相对应。
  • data :与setResult()方法中指定的Intent对象相对应。

4. 示例代码

// 在Activity A中
startActivityForResult(new Intent(this, ActivityB.class), REQUEST_CODE);

// 在Activity B中
Intent data = new Intent();
data.putExtra("result", "Hello from Activity B!");
setResult(RESULT_OK, data);

// 在Activity A中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String result = data.getStringExtra("result");
        // 处理结果数据
    }
}

注意事项

  • 如果您在setResult()方法中传递了一个Intent对象,那么您必须在onActivityResult()方法中使用相同类型的Intent对象来接收数据。
  • 如果您在setResult()方法中传递了一个null值,那么onActivityResult()方法中的data参数将为null。
  • 如果您在setResult()方法中传递了一个非法的resultCode值,那么系统会抛出IllegalArgumentException异常。

结论

setResult()方法是Activity之间传递数据的重要手段之一。通过理解setResult()方法的工作原理,您可以更好地掌握Activity之间的通信过程,并编写出更加健壮的Android应用程序。