You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:从Activity B返回数据至A且保留A原有输入数据的问题

解决方案

核心问题原因

你之前用startActivity启动Activity A时,会创建一个全新的Activity A实例,而非回到之前的那个实例。新实例不会触发onRestoreInstanceState(该方法仅在实例被系统销毁后重建时调用),所以之前保存的数据无法恢复,导致看起来被清空。

正确的做法是使用「带结果返回的启动方式」,让Activity B把数据返回给原来的Activity A实例,而非重新创建。


步骤1:从Activity A启动Activity B

推荐:使用Activity Result API(AndroidX/Jetpack项目)

这是Google推荐的新版方式,避免了旧版startActivityForResult的请求码管理问题:

// 在ActivityA的onCreate方法中注册结果回调
ActivityResultLauncher<Intent> locationLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        // 检查结果是否有效
        if (result.getResultCode() == RESULT_OK && result.getData() != null) {
            Intent data = result.getData();
            // 提取ActivityB返回的位置数据
            String placeName = data.getStringExtra("name");
            String placeAddress = data.getStringExtra("address");
            double latitude = data.getDoubleExtra("lat", 0.0);
            double longitude = data.getDoubleExtra("lng", 0.0);
            
            // 将数据更新到ActivityA的对应UI控件(原有输入数据不会丢失)
            // 示例:tvSelectedPlace.setText(placeName);
        }
    }
);

// 启动ActivityB时调用launcher
Intent intent = new Intent(ActivityA.this, ActivityB.class);
locationLauncher.launch(intent);

旧版兼容:使用startActivityForResult

如果维护旧项目,可使用传统方式:

// ActivityA中启动ActivityB
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivityForResult(intent, 100); // 100为自定义请求码,用于区分不同请求

步骤2:在Activity B中返回数据并结束

不要用startActivity跳转回A,而是通过setResult把数据返回给之前的A实例,然后销毁B:

// ActivityB中选择完位置后的处理代码
Intent resultIntent = new Intent();
resultIntent.putExtra("name", placeName);
resultIntent.putExtra("address", placeAddress);
resultIntent.putExtra("lat", latitude);
resultIntent.putExtra("lng", longitude);

// 设置返回结果(RESULT_OK表示操作成功)
setResult(RESULT_OK, resultIntent);
// 结束ActivityB,回到原来的ActivityA
finish();

步骤3:旧版方式中在Activity A接收数据

如果用的是startActivityForResult,需在Activity A中重写onActivityResult方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 匹配请求码和结果码
    if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
        // 提取返回数据
        String placeName = data.getStringExtra("name");
        String placeAddress = data.getStringExtra("address");
        double latitude = data.getDoubleExtra("lat", 0.0);
        double longitude = data.getDoubleExtra("lng", 0.0);
        
        // 更新UI,原有输入的标题、描述等数据会保留
    }
}

额外说明

你之前重写的onSaveInstanceState和onRestoreInstanceState仍然有用,它们用于应对系统因内存不足销毁Activity A的场景(比如后台被杀),保证极端情况下数据不丢失。而上述的返回方式是保证正常跳转流程中数据的留存和传递。

内容的提问来源于stack exchange,提问作者plurplemonster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:08:28