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

如何从当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:36