当通过意图从相机应用程序返回时,Android 活动被破坏
Posted
技术标签:
【中文标题】当通过意图从相机应用程序返回时,Android 活动被破坏【英文标题】:Android activity destroyed when returns from camera app through intent 【发布时间】:2014-01-22 12:40:13 【问题描述】:我的活动使用用户定义的对象来跟踪进度。当用户按下按钮时,我需要从相机中获取图像并将其存储在这些对象之一中。
问题是有时它可以正常工作,但很多时候它会重新初始化我的活动,因此所有对象和我的进度都会丢失。据我了解,这可能是因为相机是一个内存密集型应用程序,并且在后台运行时,操作系统会破坏我的应用程序以释放内存。
我不想让我的对象 Parcable,然后将它们保存到 Bundle。
我已经修改了我的 android 清单,以便包含活动标签
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
这是我的相机意图
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);
这里是onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK )
modifyResponseView_image();
我尝试了更多建议,并认为将我的活动保持在前台可能会有所帮助,但不确定是否会这样做,也不知道该怎么做。
您能提供的任何帮助将不胜感激。应用此功能的替代方案也会有所帮助。
【问题讨论】:
将状态保存在通过 onPause 传递的 Bundle 中是推荐的最佳实践。如果你不想让你的对象 Parcelable,你可以只传递对象变量。 请也发布来自 logcat 的堆栈跟踪。查看是否在活动上调用了 onDestroy()。使用 isFinishing() goo.gl/gdxJgo 查找原因 我通过创建具有基本功能的相机活动解决了这个问题。它不仅解决了问题,而且比调用相机应用程序更快地获得结果。 Android: Activity getting Destroyed after calling Camera Intent的可能重复 【参考方案1】:问题是有时它可以正常工作,但很多时候它会重新初始化我的活动,因此所有对象和我的进度都丢失了。
您的 Activity 也会在其他情况下被销毁,例如,如果用户旋转屏幕、更改区域设置、将他们的设备放入 Dock 中、从 Dock 中移除他们的设备等。在任何这些情况下,您的 Activity 的数据将会丢失,除非您通过某种方式保留它(例如,savedInstanceState
Bundle
)。
据我了解,这可能是因为相机是一个内存密集型应用程序,并且在后台运行时,操作系统会破坏我的应用程序以释放内存。
正确。在我之前的段落中,我列出了配置更改的条件,在这种情况下,您的流程会继续存在,但您的活动会被销毁并重新创建。如果操作系统终止您的进程,那么您在内存中的所有内容都将消失。不过,savedInstanceState
Bundle
应该交还给您的 Activity,因为它会跨越进程边界传递到操作系统中,直到控制权返回到您的应用程序为止。
我不想让我的对象 Parcable,然后将它们保存到 Bundle。
然后将数据保存到文件中。
或者,将您的数据保存到数据库中。
或者,将您的数据保存到SharedPreferences
。
或者,将您的数据保存到“云端”。
或者,不要使用第三方相机应用,直接将相机集成到您的应用中。
我已经修改了我的 android 清单,以便包含活动标签
近三年来,这并不是一个特别有用的属性组合:
它忽略所有其他配置更改
无法正确处理方向变化
一般是反模式
觉得将我的活动保持在前台可能会有所帮助,但不确定是否会这样做或如何做到这一点
如果您的活动在前台,则用户无法使用相机应用,因为相机应用不会在前台。
【讨论】:
感谢上下文解释 我有同样的问题,我尝试在我的片段和我的活动中实现 onSaveInstanceState,但该方法从未被调用。拍照并按保存后,直接调用activity的onDestroy方法,我无能为力...有什么建议吗? @Sandra:我建议您提出一个新的 Stack Overflow 问题,在那里您可以提供您的代码并更详细地解释您的症状。 这里已经解释了我面临的问题:***.com/questions/16014930/…,但提供的解决方案(第一个答案)对我来说似乎不是解决问题的正确方法。这就是为什么我想尝试使用 onSaveInstanceState,在我提供链接的线程中也提到了这一点以上是关于当通过意图从相机应用程序返回时,Android 活动被破坏的主要内容,如果未能解决你的问题,请参考以下文章