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

startActivityForResult废弃后如何携带Bundle选项启动Activity获取结果

问题描述

此前使用带Bundle参数的startActivityForResult启动Activity、配置转场动画并接收返回值,代码如下:

public void openActivityForResultOld(Intent intent) {
    Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(this,
        android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
    startActivityForResult(intent, 1, bundle);
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // 处理返回结果
}

由于startActivityForResult(Intent, int, Bundle)已被废弃,改用ActivityResultLauncher实现时,发现常规的launch(intent)方法无法传入携带动画配置的Bundle参数,当前问题代码如下:

public void openActivityForResult(Intent intent) {
    Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(this,
        android.R.anim.fade_in, android.R.anim.fade_out).toBundle();

    ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                // 处理返回结果
            }
        });
        
    // 此处仅能传入Intent,无法携带Bundle参数
    
    mStartForResult.launch(intent);
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}
解决方案

ActivityResultLauncher的launch方法提供了重载版本,第二个参数即可接收ActivityOptionsCompat生成的配置Bundle,不需要额外做兼容封装。
需要额外注意:不要在每次调用启动逻辑时才执行registerForActivityResult注册,该方法必须在Activity/Fragment的初始化生命周期(如Activity的onCreate)中调用,否则会抛出生命周期状态异常。

正确实现代码:

// 将Launcher定义为页面成员变量
private ActivityResultLauncher<Intent> mStartForResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    // 初始化阶段完成结果回调注册
    mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        result -> {
            // 处理页面返回结果
            int resultCode = result.getResultCode();
            Intent data = result.getData();
        });
}

public void openActivityForResult(Intent intent) {
    Bundle animOptions = ActivityOptionsCompat.makeCustomAnimation(this,
            android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
    // 调用双参数重载的launch方法传入动画配置Bundle
    mStartForResult.launch(intent, animOptions);
    // 若部分定制系统上转场动画未正常生效,可保留这行兜底,标准系统下无需额外调用
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}

其他说明

  • 传入launch方法的第二个Bundle参数仅支持系统识别的Activity启动配置(如转场动画、共享元素、启动窗口配置等),业务参数请统一放入Intent中传递,不要塞到这个Bundle里
  • 请使用AndroidX包下的ActivityOptionsCompat生成配置,不要直接使用framework层的ActivityOptions,避免低版本兼容问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:54:28