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

