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

Android特定设备onActivityResult二次调用丢失数据问题求助

解决onActivityResult二次调用历史数据丢失问题

问题根源

这个问题大概率是Activity被系统回收重建导致的——当启动图库/相机Activity时,原Activity可能因内存不足被系统销毁,返回时会重新创建,内存里的imageList和视图状态全部丢失。另外当前代码里imageList.add()的逻辑也有问题:每次选图都往列表末尾追加,没有对应到指定的图片位置,导致数据和视图不匹配。

解决方案

1. 保存与恢复Activity状态

重写onSaveInstanceState和onRestoreInstanceState(或在onCreate中恢复),把选中的图片URI持久化到Bundle里,避免Activity重建时数据丢失:

// 保存状态
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putStringArrayList("image_list", ArrayList(imageList))
}

// 在onRestoreInstanceState中恢复状态
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val savedImages = savedInstanceState.getStringArrayList("image_list")
    savedImages?.let {
        imageList.clear()
        imageList.addAll(it)
        // 恢复对应ImageView的显示
        imageList.forEachIndexed { index, uri ->
            when(index) {
                0 -> binding.imageDoc1.setImageURI(Uri.parse(uri))
                1 -> binding.imageDoc2.setImageURI(Uri.parse(uri))
                2 -> binding.imageDoc3.setImageURI(Uri.parse(uri))
            }
        }
    }
}

// 或者在onCreate中直接恢复
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ... // 初始化视图绑定
    savedInstanceState?.let {
        val savedImages = it.getStringArrayList("image_list")
        savedImages?.let { list ->
            imageList.clear()
            imageList.addAll(list)
            // 恢复视图
            imageList.forEachIndexed { index, uri ->
                when(index) {
                    0 -> binding.imageDoc1.setImageURI(Uri.parse(uri))
                    1 -> binding.imageDoc2.setImageURI(Uri.parse(uri))
                    2 -> binding.imageDoc3.setImageURI(Uri.parse(uri))
                }
            }
        }
    }
}

2. 修正imageList的更新逻辑

当前代码用imageList.add()会导致列表无限追加,应该根据requestCode对应索引替换数据,而不是添加:

先提前初始化固定大小的列表:

// 初始化对应三个图片位置的空列表
val imageList = mutableListOf("", "", "")

然后修改onActivityResult中的数据更新逻辑:

// 替换原来的imageList.add(selectedImage.toString())
when (requestCode) {
    GALLERY_1, CAMERA_1 -> imageList[0] = selectedImage.toString()
    GALLERY_2, CAMERA_2 -> imageList[1] = selectedImage.toString()
    GALLERY_3, CAMERA_3 -> imageList[2] = selectedImage.toString()
}

3. 额外优化:确保Uri权限有效

如果涉及到图库选图的Uri持久化,要确保configImagePersistentPermission方法正确调用了takePersistableUriPermission,避免Activity重建后Uri权限失效导致无法访问图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:46