多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

RxActivityResult官方弃用:迁移到AndroidX ActivityResult与Navigation组件的完整指南

RxActivityResult官方弃用:迁移到AndroidX ActivityResult与Navigation组件的完整指南 RxActivityResult官方弃用迁移到AndroidX ActivityResult与Navigation组件的完整指南【免费下载链接】RxActivityResultA reactive-tiny-badass-vindictive library to break with the OnActivityResult implementation as it breaks the observable chain.项目地址: https://gitcode.com/gh_mirrors/rx/RxActivityResultRxActivityResult 是一款把 AndroidonActivityResult回调包装成 RxJavaObservable的开源库但作者已官方弃用Deprecated它并推荐使用 AndroidX ActivityResult API 和 Navigation 组件作为替代。本文用通俗的语言讲清弃用原因、两个官方替代方案的能力以及新手也能照做的 5 步迁移清单。先说结论为什么 RxActivityResult 被官方弃用 一句话官方原生能力已经覆盖了这个库的全部价值。老版本的 Android 用startActivityForResultrequestCodeonActivityResult三件套获取返回数据这套回调模式最大的痛点是回调是异步且割裂的会把 RxJava 的链式调用flatMap、map…打断需要手动管理requestCode常量容易写错、冲突回调触发时原来的 Activity/Fragment 可能已被系统重建直接引用会崩溃。RxActivityResult 正是为解决这些问题而生它通过一个透明的 HolderActivity.java 中转请求在 RxActivityResult.java 里把结果封装成 Result.java 并通过PublishSubject发射出来还借助 ActivitiesLifecycleCallbacks.java 全局监听 Activity 生命周期来找回当前存活的界面实例。而 AndroidX 从 API 层面推出了ActivityResult API原生解决了上面所有痛点同时官方维护、无需第三方依赖。因此 README.md 开头直接标注了弃用警告并指向 Navigation 组件的NavBackStackEntry方案。回顾旧方案长什么样迁移前要认清这些 API老代码里通常有这三处痕迹迁移时逐一替换即可旧方案RxActivityResult说明RxActivityResult.register(application)在 SampleApp.java 中全局注册接管生命周期监听RxActivityResult.on(this).startIntent(intent).subscribe(...)发起系统调用相机、选图等并订阅结果见 SampleActivity.javaresult.targetUI() / resultCode() / data()从结果对象中安全取回界面实例和数据见 Result.java另外两个进阶能力也常被用到IntentSender 请求startIntentSender(...)对应 RequestIntentSender.java前置结果处理OnPreResult允许你在结果最终发射前对data做修改接口定义在 OnPreResult.java示例见 OnPreResultActivity.java。迁移目标一AndroidX ActivityResult API首选方案AndroidX 的ActivityResult APIregisterForActivityResult是目前官方推荐的主力方案核心优势无需requestCode每个 launcher 自带身份告别常量管理生命周期安全在 Activity/Fragment 销毁前注册、销毁后自动清理不用再担心界面已被重建无需全局注册不需要类似register(application)的启动步骤内置常用契约拍照TakePicture、选图GetContent、请求权限等都有现成 Contract。旧 API 与新 API 对照速查表你要做的事RxActivityResult 写法ActivityResult API 写法发起意图请求RxActivityResult.on(this).startIntent(intent)launcher.launch(input)接收结果subscribe(result - ...)ActivityResultCallback的onResult(data)判断用户取消resultCode() ! RESULT_OK结果对象为 null / 取消的契约值IntentSender 请求startIntentSender(...)ActivityResultContracts.StartIntentSenderForResult全局初始化RxActivityResult.register(app)不需要最小示例对比// 旧RxActivityResult RxActivityResult.on(this).startIntent(takePhoto) .subscribe(result - result.targetUI().showImage(result.data())); // 新AndroidX ActivityResult ActivityResultLauncherUri launcher registerForActivityResult( new ActivityResultContracts.TakePicture(), uri - showImage(uri)); launcher.launch(uri);迁移目标二Navigation 组件的 NavBackStackEntry跨页面回传场景如果你的结果不是来自系统调用而是上一个页面要把数据带回来官方推荐用Navigation 组件配合NavBackStackEntry返回结果在上一页通过navController.getPreviousBackStackEntry()拿到上一个回栈条目把要回传的数据以 Bundle 形式放到该条目的savedStateHandle或共享 ViewModel 中上一页监听变化后更新 UI再执行导航返回。这套方案天然支持嵌套 Fragment 和多级回栈适合表单填写、商品详情回刷购物车这类业务场景。对于 RxActivityResult 用户凡是自定义 Activity 之间传结果的需求都可以按这个模式改写。五步迁移清单照着做即可✅第 1 步移除依赖—— 删除build.gradle中的 RxActivityResult 依赖确认代码中不再 importrx_activity_result2包 ✅第 2 步删掉全局注册—— 移除 SampleApp.java 中RxActivityResult.register(this)无需任何替代 ✅第 3 步改造发起点—— 把on(this).startIntent(...)换成registerForActivityResultlauncher.launch(...)注意 launcher 必须在onCreate之前或页面进入 STARTED 状态前初始化 ✅第 4 步改写结果处理—— 不再调用result.targetUI()回调内直接操作当前界面即可生命周期由框架保证 ✅第 5 步处理特殊场景—— IntentSender 改用StartIntentSenderForResult契约需要结果预处理的场景把 OnPreResultActivity.java 中OnPreResult的逻辑挪进回调函数里同步处理。迁移时最容易踩的 3 个坑⚠️坑一在生命周期不对的时机注册 launcher—— ActivityResult API 要求注册发生在页面创建阶段动态按钮点击时才register会抛异常这是旧库用户最常报的错误 ⚠️坑二继续依赖targetUI()的思维惯性—— 新回调里直接就是当前有效实例找不到这个方法属正常不需要替代 ⚠️坑三Fragment 没换成 AndroidX 版本—— 旧库就要求 Fragment 继承自 androidx 体系迁移后这条限制依然成立android.app.Fragment用户需要先完成 AndroidX 迁移。写在最后RxActivityResult 在 RxJava 1 时代是不打破响应式链条的最佳实践之一它的透明 Holder 中转与生命周期找回设计见 HolderActivity.java至今仍值得学习。但工程上官方方案永远比社区补丁更值得长期投入系统调用回传数据 → 用ActivityResult API页面之间回传数据 → 用Navigation NavBackStackEntry。按上面的五步清单执行绝大多数项目可以在一个下午内完成迁移同时获得更稳的生命周期保障和更少的依赖负担。【免费下载链接】RxActivityResultA reactive-tiny-badass-vindictive library to break with the OnActivityResult implementation as it breaks the observable chain.项目地址: https://gitcode.com/gh_mirrors/rx/RxActivityResult创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表