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

