使用 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 创建和结果解析逻辑。
验证
- 正常保存时,调用方收到
RESULT_OK和新地址。 - 返回或取消时,不覆盖原值。
- 打开“开发者选项”中的“不保留活动”后重复流程,确认结果仍能正确恢复。
参考
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
使用 Activity Result API 获取页面返回结果
https://blog.mintalix.com/posts/study-activity-result-api/相关文章智能推荐
1
在旧版 Android 界面中使用 ExpandableListView
android-development在不依赖已弃用 ExpandableListActivity 的前提下,用 ExpandableListView 和 BaseExpandableListAdapter 实现两级列表。
2
从 Kotlin synthetic 迁移到 View Binding
android-development解释 Kotlin Android Extensions synthetic 视图访问为何消失,并使用官方支持的 View Binding 完成替代。
3
排查 Android 深色主题下的标题栏冲突
android-development说明 windowActionBar 与 windowNoTitle 的真实作用,并给出在深色主题中排查重复标题栏和主题继承问题的方法。
4
最小路径和:压缩二维动态规划
algorithms从只能向右或向下移动的约束推导最小路径和状态转移,并将二维状态表压缩为一维数组。
5
最大正方形:用相邻状态确定边长
algorithms定义以当前单元格为右下角的最大正方形边长,推导三邻居状态转移,并给出 Java 动态规划实现。
随机文章随机推荐


