Android中startActivityForResult遇到的坑

本文描述了一个关于Android应用中Activity状态丢失的问题。当使用startActivityForResult从Activity A跳转到Activity B并返回时,Activity A的状态被重置,原因是开启了手机设置中的不保留活动选项,导致Activity A在后台被销毁。文章强调了在此情况下保存状态的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天下午5点收到一个紧急bug,项目某个页面需要选择国家信息然后返回在原来的页面,bug描述:用户填好当前页面的信息,跳转其他页面选择国家信息的时候再返回来,这回所有的用户填写的信息都被重置了???

一看就感觉不对劲,排除了半个小时,发现当前页面调用startActivityForResult跳转到国家选择页面,当前的activity会调用onDestroy()方法,选择国家页面回到用户填写信息页面重新执行onCreate()方法,清晰点描述是Activity A调用startActivityForResult跳转到Activity B,A调用onDestroy(),B 执行finish返回A,A重新执行onCreate(),再回调onActivityResult()

这很不可思议吧,非常不科学,startActivityForResult是不会结束当前页面的,除非写了finish方法,原因是因为测试的骚操作,开启手机设置中不保留页面活动这个操作,当activity不在前台就会被系统回收,所以A执行onDestroy()方法,当B返回值的时候A先执行onCreate()方法,然后在接收onActivityResult()传回来的值。

讲道理,也不是测试的锅,关于需要给用户填写的信息表单确实要考虑做保存状态,这才是比较友好的操作,不知道哪个煞笔懒得写savedInstanceState()、onRestoreInstanceState进行保存和恢复状态,补充好状态愉快提交测试,搞定下班!!!

### Android `startActivityForResult` 替代方案 随着 Android 开发的发展,`startActivityForResult()` 方法已被标记为废弃。取而代之的是更现代的 **Activity Result API**,这提供了更加简洁和灵活的方式来处理活动之间的结果传递。 #### 使用 `registerForActivityResult` 通过使用 `registerForActivityResult` 可以轻松替换旧有的 `startActivityForResult` 调用。下面是一个具体的例子来展示这一过程: ```kotlin // 定义启动器并注册回调函数 val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 处理返回的数据 val data: Intent? = result.data // 进一步操作... } } // 创建意图对象用于启动新活动 val intent = Intent(this, NewWordActivity::class.java) // 启动目标活动并将意图作为参数传入 startForResult.launch(intent) ``` 此代码片段展示了如何创建一个名为 `startForResult` 的启动器实例,并将其关联到特定的结果处理器上[^1]。当调用 `.launch(intent)` 时,会触发新的活动启动流程;一旦该活动结束,则自动执行之前设置好的回调逻辑。 对于图片捕获场景下的应用案例可以参照如下写法: ```kotlin val takePicture = registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap -> // 图片获取后的处理逻辑 } takePicture.launch(null) ``` 上述示例中采用了不同的合同类 (`ActivityResultContracts`) 来适应具体需求——这里选择了 `TakePicturePreview` 合同以便于从相机预览界面直接获得拍摄的照片位图数据[^2]。 另外,在项目构建文件里需添加必要的依赖项支持这些特性: ```gradle dependencies { implementation 'androidx.activity:activity-ktx:1.7.0' implementation 'androidx.fragment:fragment-ktx:1.5.6' } ``` 确保版本号是最新的稳定版,这样可以获得最佳兼容性和性能表现[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值