如何从当前Activity获取结果并返回至前一个Activity?多场景实现
嘿,这个需求其实就是Android里典型的Activity间结果回传场景,刚好我之前处理过类似多Activity调用同一个选择器的情况,给你分两种方案讲——一种是兼容旧项目的传统方式,另一种是官方现在主推的新API,你可以根据项目的AndroidX版本来选:
方案一:传统的
startActivityForResult方式(已弃用,但旧项目仍可使用) 这种方式是之前Android的标准写法,虽然现在官方不推荐了,但老项目里还是很常见:
步骤1:在国家Activity中启动Place Picker
给按钮添加点击事件,用startActivityForResult替代普通的startActivity,同时定义一个唯一的请求码(用来区分不同的请求):// 先定义请求码(类内部常量) private static final int REQUEST_CODE_PLACE_PICKER = 1001; // 按钮点击事件 btnPickLocation.setOnClickListener(v -> { Intent pickerIntent = new Intent(this, PlacePickerActivity.class); // 可选:传递额外标记,比如区分是哪个国家的请求(如果需要的话) pickerIntent.putExtra("FROM_ACTIVITY", "INDIA"); startActivityForResult(pickerIntent, REQUEST_CODE_PLACE_PICKER); });步骤2:在Place Picker中返回结果
当用户选好位置后,把位置数据打包进Intent,调用setResult后关闭当前Activity:// 假设你已经获取到选中的位置信息(比如名称、经纬度) btnConfirm.setOnClickListener(v -> { Intent resultIntent = new Intent(); resultIntent.putExtra("PLACE_NAME", selectedPlace.getName()); resultIntent.putExtra("PLACE_LAT", selectedPlace.getLatitude()); resultIntent.putExtra("PLACE_LNG", selectedPlace.getLongitude()); // 设置成功结果码 setResult(Activity.RESULT_OK, resultIntent); finish(); // 关闭选择器 }); // 如果用户取消选择 btnCancel.setOnClickListener(v -> { setResult(Activity.RESULT_CANCELED); finish(); });步骤3:在国家Activity中接收结果
重写onActivityResult方法,根据请求码和结果码处理返回的数据:@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 先匹配请求码,再判断结果是否成功 if (requestCode == REQUEST_CODE_PLACE_PICKER && resultCode == Activity.RESULT_OK) { if (data != null) { // 取出数据并更新UI String placeName = data.getStringExtra("PLACE_NAME"); double lat = data.getDoubleExtra("PLACE_LAT", 0.0); double lng = data.getDoubleExtra("PLACE_LNG", 0.0); tvSelectedLocation.setText(String.format("选中位置:%s(%.2f, %.2f)", placeName, lat, lng)); } } else if (resultCode == Activity.RESULT_CANCELED) { // 处理取消选择的情况 tvSelectedLocation.setText("未选择位置"); } }
方案二:官方推荐的Activity Result API(AndroidX 1.2.0+可用)
这是现在Google主推的写法,避免了请求码冲突的问题,代码也更模块化:
步骤1:在国家Activity中注册结果Launcher
先定义一个全局的ActivityResultLauncher,然后在onCreate里初始化它:private ActivityResultLauncher<Intent> placePickerLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_india); // 注册Launcher,处理返回结果 placePickerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null) { String placeName = data.getStringExtra("PLACE_NAME"); double lat = data.getDoubleExtra("PLACE_LAT", 0.0); double lng = data.getDoubleExtra("PLACE_LNG", 0.0); // 更新UI显示 tvSelectedLocation.setText(String.format("选中位置:%s(%.2f, %.2f)", placeName, lat, lng)); } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { tvSelectedLocation.setText("未选择位置"); } } ); }步骤2:用Launcher启动Place Picker
按钮点击事件里直接调用Launcher的launch方法:btnPickLocation.setOnClickListener(v -> { Intent pickerIntent = new Intent(this, PlacePickerActivity.class); pickerIntent.putExtra("FROM_ACTIVITY", "INDIA"); placePickerLauncher.launch(pickerIntent); });步骤3:Place Picker的返回逻辑和方案一完全一致
不需要修改任何代码,还是用setResult传递数据后finish即可。
额外提示
- 如果你的5个国家Activity逻辑一致,可以考虑封装一个BaseActivity,把结果处理的逻辑放在基类里,减少重复代码。
- 传递复杂数据时,建议封装成
Parcelable对象(比如创建PlaceInfo类实现Parcelable),比单独传递多个参数更整洁。 - 确保Place Picker Activity已经在
AndroidManifest.xml中注册了。
内容的提问来源于stack exchange,提问作者Mrunal
相关产品推荐
相关产品推荐

