使用 Activity Result API 获取页面返回结果

384 字
2 分钟
使用 Activity Result API 获取页面返回结果

目标#

在一个 Activity 中启动另一个 Activity,并以类型更清晰、生命周期更安全的方式接收返回数据。

适用范围#

startActivityForResult() 和 onActivityResult() 已弃用。基于 AndroidX 的 Activity 或 Fragment 应使用 Activity Result API。以下示例采用 Java,并使用内置的 StartActivityForResult 协定。

注册结果处理器#

把 launcher 声明为 Activity 成员,并在 Activity 创建期间完成注册:

private final ActivityResultLauncher<Intent> editAddressLauncher =
    registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() != Activity.RESULT_OK) {
                return;
            }

            Intent data = result.getData();
            if (data == null) {
                return;
            }

            String address = data.getStringExtra("address");
            if (address != null) {
                addressEditText.setText(address);
            }
        }
    );

不要在点击事件中重复注册。launcher 必须在生命周期所有者进入 STARTED 状态之前注册,实际启动则应等到生命周期创建完成之后。

启动目标页面#

Intent intent = new Intent(this, AddressActivity.class);
intent.putExtra("initialAddress", addressEditText.getText().toString());
editAddressLauncher.launch(intent);

目标页面读取输入并返回结果:

String initialAddress = getIntent().getStringExtra("initialAddress");

Intent result = new Intent();
result.putExtra("address", addressEditText.getText().toString());
setResult(Activity.RESULT_OK, result);
finish();

取消操作可以调用 setResult(Activity.RESULT_CANCELED),或直接结束页面。

何时自定义协定#

内置协定覆盖请求权限、拍照、选择内容等常见操作。当输入输出类型固定且会被多处复用时,再继承 ActivityResultContract<I, O> 封装 Intent 创建和结果解析逻辑。

验证#

  1. 正常保存时,调用方收到 RESULT_OK 和新地址。
  2. 返回或取消时,不覆盖原值。
  3. 打开“开发者选项”中的“不保留活动”后重复流程,确认结果仍能正确恢复。

参考#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

使用 Activity Result API 获取页面返回结果
https://blog.mintalix.com/posts/study-activity-result-api/
作者
Mint
发布于
2022-04-13
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Mint
软件开发、工程实践与技术思考。
分类
标签