在 onActivityResult 之前和之后调用 onCreate

Posted

技术标签:

【中文标题】在 onActivityResult 之前和之后调用 onCreate【英文标题】:onCreate called before and after onActivityResult 【发布时间】:2012-07-15 12:26:43 【问题描述】:

我尝试以下方式打开相机:

...
    private void runCamera() 
        String storageState = Environment.getExternalStorageState();
        if (storageState.equals(Environment.MEDIA_MOUNTED)) 

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File imageFile = new File(Singleton.instanse.mPushFilePath);
            mImageFileUri = Uri.fromFile(imageFile);
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                    mImageFileUri);
            startActivityForResult(intent, CAMERA_RESULT);
    
...

如果我运行这个方法运行下一个方法:

07-16 19:46:22.264: I/System.out(6875): -onPause
07-16 19:46:26.104: I/System.out(6875): -onStop

我制作照片,结束运行下一个方法:

07-16 19:46:41.217: I/System.out(6875): -onDestroy
07-16 19:46:41.284: I/System.out(6875): -onCreate
07-16 19:46:41.291: I/System.out(6875): -onStart
07-16 19:46:41.295: I/System.out(6875): -onActivityResult
07-16 19:46:41.295: I/System.out(6875): -onResume
07-16 19:46:41.295: I/System.out(6875): -onPostResume
07-16 19:46:41.522: I/System.out(6875): -onPause
07-16 19:46:41.522: I/System.out(6875): -onStop
07-16 19:46:41.522: I/System.out(6875): -onDestroy
07-16 19:46:41.604: I/System.out(6875): -onCreate
07-16 19:46:41.612: I/System.out(6875): -onStart
07-16 19:46:41.616: I/System.out(6875): -onResume
07-16 19:46:41.616: I/System.out(6875): -onPostResume

为什么 onDestroy 运行两次?如何解决? 这个问题在 Android 2.2 中发现。在 Android 2.3.3 中,onDestroy 从未调用过!

【问题讨论】:

请使用android-activity标签而不是activity标签:) 这可能有用***.com/questions/10411009/… Akki,你真的帮了我!谢谢! 【参考方案1】:

实际上,相机会导致您的 Activity 的方向发生变化,这就是您的 Activity 被销毁和重新创建的原因。

将此添加到您的清单文件中,它将防止方向更改,并且您的活动不会被破坏和重新创建。

<activity
    android:name=".YourActivity"
    android:configChanges="orientation|keyboardHidden"
    android:screenOrientation="portrait" >
</activity>

Activity killed / onCreate called after taking picture via intent

【讨论】:

如果您不能强制活动处于特定方向,您会怎么做?我遇到了类似的问题,无法强制定位... 我遇到了类似的问题。我的活动中有此代码。启动我的相机,但是因为我的活动在 OnActivityResult 回调之前和之后调用了 OnCreate,所以我放置的视图中永远不会看到图像,除非在活动开始之前设备处于横向模式。 不是解决方案。如果您的设备在启动相机时没有足够的可用 RAM 将您的活动保存在内存中(发生这种情况……),问题仍然存在。 @MarcPlano-Lesay 你知道如何处理吗,我想保持我的活动并调用相机意图 @ParagPawar 你没有办法强制执行。如果需要内存,Android 删除它。将您的状态保存在onPause 并在onResume 中恢复它。【参考方案2】:

onDestroy 不保证会被调用。确保将持久状态保存在onPause 而不是onStoponDestroy。永远不要依赖 onStoponDestroy 被调用。

【讨论】:

【参考方案3】:

onDestroy 不保证会在任何安卓版本上执行,如果是,你应该快速执行一些操作并返回

也可以看到Activity OnDestroy never called?

【讨论】:

以上是关于在 onActivityResult 之前和之后调用 onCreate的主要内容,如果未能解决你的问题,请参考以下文章

关于片段生命周期,何时调用片段的 onActivityResult?

IllegalStateException:在 onSaveInstanceState 和 onActivityResult 之后无法执行此操作

onActivityResult 中的操作和“错误在 onSaveInstanceState 之后无法执行此操作”

当我调用 startResolutionForResult 时,onActivityResult() 没有在片段中执行

是否在 onActivityResult() 之前调用了 onResume()?

Android P onStart 在 onActivityResult 之前调用