学会使用onActivityResult获取另一个Activity传递的数据

发布时间:2023-12-08

学会使用onActivityResult获取另一个Activity传递的数据

更新:2023-05-14 07:24

一、什么是onActivityResult

Android中,Activity之间经常需要进行数据交互。当一个Activity需要启动另一个Activity来获取某些数据时,启动的Activity称为被调用方Activity,调用方Activity则需要接收从被调用方Activity返回的数据。这时就需要用到onActivityResult。 onActivityResult是一个方法,用于处理被调用方返回的数据。被调用方Activity在返回数据时调用setResult()方法,并将结果作为参数传递给setResult()方法。调用方Activity在接收被调用方返回数据时,会回调onActivityResult()方法并接收数据。

二、onActivityResult的使用步骤

以下是onActivityResult的使用步骤: 1、在调用方Activity中通过startActivityForResult()方法启动被调用方Activity,启动代码如下:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);

其中REQUEST_CODE是一个整数,用于在调用方Activity中确定是哪一个Activity返回的数据。 2、在被调用方Activity中设置返回数据并调用finish()方法返回到调用方Activity,返回代码如下:

Intent intent = new Intent();
intent.putExtra("data", "Hello World");
setResult(RESULT_OK, intent);
finish();

其中"Hello World"是要返回的数据,RESULT_OK是一个常量,表示返回成功。 3、在调用方Activity中重写onActivityResult()方法接收数据,代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
        String result = data.getStringExtra("data");
        Log.d("MainActivity", "Result: " + result);
    }
}

其中requestCode参数就是第1步中的REQUEST_CODE,resultCode参数是返回数据是否成功的标识,data是Intent对象,包含了被调用方Activity返回的数据。

三、注意事项

以下是onActivityResult使用过程中需要注意的事项: 1、startActivityForResult()和setResult()都是Activity的方法,需要在Activity中使用。 2、被调用方Activity返回数据时,必须调用setResult()方法才能返回数据。 3、从被调用方Activity返回数据时,requestCode、resultCode、data三个参数都必须传递回调用方Activity。 4、在调用方Activity中接收数据时,需要判断requestCode和resultCode是否符合预期。 5、在调用方Activity中接收数据时,需要判断data是否为空,因为被调用方Activity可能不返回数据。 6、如果多个Activity都会返回数据给调用方Activity,可以使用requestCode来区分是哪个Activity返回的数据。

四、完整代码示例

下面是一个完整的例子: 1、在MainActivity中启动SecondActivity:

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_start_second_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
            String result = data.getStringExtra("data");
            Log.d("MainActivity", "Result: " + result);
        }
    }
}

2、在SecondActivity中返回数据:

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        findViewById(R.id.btn_back_to_main_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data", "Hello World");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

3、在布局文件中添加按钮以启动SecondActivity并返回数据:

<button android:id="@+id/btn_start_second_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Second Activity"></button>
<button android:id="@+id/btn_back_to_main_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Back to Main Activity"></button>

以上是onActivityResult的使用方法和一个完整的例子,可以用于在Activity之间传递数据。