现状及原因如果一个view中创建了一个fragmentfragment主要是为了处理一个拍照组件选择照片后返回的activityresult处理或者其他页面返回后需要在activityresult进行结果处理切记切记最好不要用无UI式的弱引用fragment而是需要拿到这个view的宿主的activity进行OnResult activity处理因为如果使用fragment虽然debug包和包可以正常的接收到毁掉但是对于发板包在比较严格的环境下是我们是收不到fragment的result毁掉因为会被宿主Activity接受而导致view中的fragment activity回调不会被处理。因此在使用的时候注意尽量使用view 的宿主activity或者是用androidx的register的方式来注册毁掉。场景自定义View内部需要接收页面跳转返回结果拍照/选图 ActivityResult ❌ 不推荐方案在View里动态附加一个无UI空白Fragment经典“影子Fragment”方案✅ 推荐方案1拿View宿主Activity用Activity的 registerForActivityResult✅ 推荐方案2使用 androidx.activity.result 的独立注册方式不依赖Fragment影子Fragment原理把Fragment attach到宿主Activity借Fragment的 registerForActivityResult 托管回调。Debug包进程/页面生命周期宽松attach成功回调正常。Release发包严苛ROM/系统限制1. 宿主Activity本身会接管 ActivityResult 分发View动态添加的空白Fragment在某些场景下被系统回收、detach、不纳入result分发链路最终跳转回来影子Fragment收不到回调逻辑丢失。本质Fragment属于Activity的子组件它的result回调依赖Activity的状态和FragmentManager不是稳定可靠的载体尤其View内部动态创建Fragment生命周期和View绑定和Activity/FM生命周期不同步极易踩坑。两种推荐实现方案方案A获取View宿主Activity直接在Activity注册首选拿到View所在Activity由Activity托管 ActivityResultLauncher View只负责触发跳转。kotlin// 在你的自定义View中fun getHostActivity(): Activity? {var context this.contextwhile (context is ContextWrapper) {if (context is Activity) return contextcontext context.baseContext}return null}fun openCamera() {val activity getHostActivity() ?: returnactivity.cameraLauncher.launch(cameraIntent)}缺点需要把launcher定义在ActivityView要和Activity做简单通信优点回调最稳系统原生分发Debug/Release环境行为一致不会出现丢回调。方案BActivityResultRegistry 独立注册推荐解耦Activityandroidx.activity:activity-ktx 提供 ActivityResultRegistry 不需要Activity/Fragment直接使用Registry注册LauncherView内部就可以注册不用影子Fragment。kotlin// 核心从宿主Activity拿到ActivityResultRegistryval registry (context as Activity).activityResultRegistryval launcher registry.register(“photo_pick”, object : ActivityResultContractIntent, ActivityResult() {override fun createIntent(context: Context, input: Intent): Intent inputoverride fun parseResult(resultCode: Int, intent: Intent?): ActivityResult {return ActivityResult(resultCode, intent)}}) { result -// 拍照/选图回调在这里处理}关键点registry属于Activity生命周期跟随Activity注册key photo_pick 需要唯一注意必须在Activity的onCreate之前完成register如果View是动态懒加载创建晚于Activity onCreate会报错。适用不想把拍照逻辑上移到Activity想封装在View内部。避坑要点总结❌ 禁止View内部 new 一个空白无UI Fragment attach用来托管ActivityResult。Release环境高概率丢失回调。✅ 优先把 ActivityResultLauncher 注册在宿主ActivityView只做触发。✅ 备选 ActivityResultRegistry 独立注册不依赖Fragment。Context类型校验获取宿主时注意 context 有可能是 ContextThemeWrapper 不能强转要循环unwrap。内存风险拿到Activity引用时View销毁时注意取消监听防止泄漏。补充为什么很多老代码用影子Fragment旧版Android没有 registerForActivityResult 只能依赖Fragment接收 onActivityResult androidx推出ActivityResultRegistry之后影子Fragment方案已经属于过时方案不适合新项目尤其组件化、自定义View。为何会产生这种现象Debug正常、Release丢回调根源不是分发被抢占而是影子Fragment实例在Release环境下不复存在旧影子Fragment原理把一个看不见的Fragment add到宿主Activity的FragmentManager registerForActivityResult 挂载在这个Fragment实例上。Activity跳转返回后系统/AndroidX的Result分发逻辑找到当初注册Launcher的那个Fragment实例调用回调。Debug包为什么能收到Debug包不开启混淆、不开启严苛的系统内存回收策略App后台不容易被杀页面旋转/重建场景少。动态add的影子Fragment只要没主动remove实例一直保留在FragmentManager里。跳转回来分发器能找到这个Fragment实例 → 回调正常执行。Release发版包为什么收不到最常见3个原因① Release开启混淆 FragmentManager状态保存最主要Activity发生重建横竖屏、内存不足系统杀Activity重建时系统会序列化保存FragmentManager状态。我们动态临时add的影子Fragment没有在xml/onCreate静态声明重建后FM会恢复静态Fragment但不会自动重建你代码里动态new出来的临时影子FragmentActivity重建完成回到页面触发ActivityResult分发注册Launcher的那个旧Fragment实例已经销毁新页面里没有这个实例 → 找不到回调直接丢弃。 不是宿主Activity拿到了回调是没人能匹配上这个注册的Launcher回调直接丢失。② Release ROM/系统后台管控更强Release包系统对App内存管控更严格。App退后台时更容易被裁剪组件Debug包系统会放宽限制保留更多对象。③ 混淆可能把影子Fragment类名抹除如果没给这个空白Fragment加 -keep 混淆规则Release混淆后类名改变FM状态恢复的时候无法实例化Fragment直接丢失。
企业数字化 ERP 产品动态
相关推荐
鼎讯信通DXG-800光缆普查仪OTDR与普查双功能解析 鼎讯光缆普查仪DXG-800系列是一款把光缆查线功能和完整OTDR功能集成在一起的精密仪器。从功能配置来看,它的定位很明确:一台设备同时解决“找哪根缆”和“缆哪里有问题”两个问题。普查功能方面,DXG-800采用单纤检测方式,无须回环… · 2026/9/24 3:46:08
陪诊行业爆发:平台 + 陪诊师 + 医院 + 渠道多方分账怎么解? 随着老龄化加剧、优质医疗资源紧张和城市就医流程复杂化,陪诊服务正在从 “小众帮忙” 变成城市家庭的高频刚需。一线城市陪诊平台数量已超过 200 家,不少项目从医院周边的小团队,快速成长为连接患者、陪诊师、医院渠道、保险公司和推荐人的医… · 2026/9/24 3:45:20
先验证谁付钱——「2026年,手机就能做」可复制的 AI 步骤拆解 **项目名片(学习向)**赛道:内容创作变现模式:广告/橱窗(公开常见路径)启动门槛:低到中适合人群:图文创作者核心承诺:先验证谁付钱重要声明:本文为 **AI 应用与… · 2026/9/24 3:45:20
Jackett终极指南:3步实现种子搜索自动化,告别手动切换站点的烦恼 Jackett终极指南:3步实现种子搜索自动化,告别手动切换站点的烦恼
Jackett是一款强大的开源代理服务器,专为统一管理各类种子搜索站点而设计。作为媒体自动化生态系统的关键组件,它能够将全球700多个公共、半私有和私有种子站点的… · 2026/9/24 15:20:40
RuoYi-Vue Pro 架构解析:单体还是微服务选型指南 RuoYi-Vue Pro 架构解析:单体还是微服务选型指南 【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 微信小程序… · 2026/9/24 15:20:34
腾讯开源AI共享平台:统一管理多模型API,实现家庭与团队按量计费 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:20:34
OOTDiffusion 虚拟试穿快速上手指南:从两张图到一张试穿效果的完整教程 OOTDiffusion 虚拟试穿快速上手指南:从两张图到一张试穿效果的完整教程 【免费下载链接】OOTDiffusion [AAAI 2025] Official implementation of "OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on" 项目地址:… · 2026/9/24 15:20:34
OpenSCAD 内置 HIDAPI 库解析:SpaceMouse 3D 输入设备的底层接入实现 图形学3D建模桌面应用 【免费下载链接】openscad OpenSCAD - The Programmers Solid 3D CAD Modeller 项目地址: https://gitcode.com/gh_mirrors/op/openscad 点击查看 免费下载 本篇文章围绕 OpenSCAD 仓库内置的 hidapi 第三方库(版本 0.11.2&#… · 2026/9/24 15:20:34
STM32嵌入式C++11实战:突破资源限制与实时性瓶颈 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:20:27
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44