从相机应用程序通过意图返回时,Android活动被破坏

时间:2014-01-04 22:19:27

标签: android android-intent android-activity android-camera

我的活动使用用户定义的对象来跟踪进度。当用户按下按钮并将其存储在其中一个对象中时,我需要从相机中获取图像。

问题在于,有时它工作正常,但很多时候它会重新初始化我的活动,因此所有对象和我的进度都会丢失。据我所知,这可能是因为相机是一个内存密集型应用程序,而在后台,操作系统会破坏我的应用程序以释放内存。

我不想让我的对象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();
}

我已经尝试了更多的建议,并认为将我的活动保持在前台可能会有所帮助,但我不确定它是否会发生,也不知道如何去做。

我们将非常感谢您提供的任何帮助。应用此功能的替代方案也会有所帮助。

1 个答案:

答案 0 :(得分:9)

  

问题在于,有时它工作正常,但很多时候它会重新初始化我的活动,因此所有对象和我的进度都会丢失。

您的活动也会在其他条件下销毁,例如用户旋转屏幕,更改区域设置,将设备放入底座,从底座中移除设备等。在任何情况下,您的活动都是数据将会丢失,除非您通过某种方式保留它(例如savedInstanceState Bundle)。

  

据我所知,这可能是因为相机是一个内存密集型应用程序,而在后台,操作系统会破坏我的应用以释放内存。

正确。在我之前的段落中,我列出了配置更改的条件,在这种情况下,您的流程会一直存在,但您的活动会被销毁并重新创建。如果操作系统终止了您的进程,那么您在内存中的所有内容都将消失。 savedInstanceState Bundle应该交还给您的活动,因为它会跨越流程边界传递到操作系统中,直到控件返回到您的应用程序为止。

  

我不想让我的对象Parcable,然后将它们保存到Bundle。

然后将数据保存到文件中。

或者,将数据保存到数据库中。

或者,将您的数据保存到SharedPreferences

或者,将您的数据保存到“云端”。

或者,请勿使用第三方相机应用程序,并将相机直接集成到您的应用程序中。

  

我修改了我的Android清单,以便活动标记包含

近三年来,这并不是一个特别有用的属性组合:

  • 忽略所有其他配置更改

  • 它无法正确处理方向更改

  • 这通常是一种反模式

  

觉得将我的活动保持在前台可能会有所帮助,但我不确定它是否会发生以及如何做到这一点

如果您的活动位于前台,则用户无法使用相机应用,因为相机应用不会位于前台。