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
相关产品推荐
相关产品推荐

