从相机应用程序返回时重新创建活动

Pau*_*sma 5 android activity-lifecycle android-camera-intent android-lifecycle

此问题仅出现在两款较旧的三星 Galaxy 机型上,但仍然非常容易重现。

我有一个简单的应用程序,可以显示通过设备的相机应用程序拍摄的照片。它有一个按钮来启动该应用程序,并在 AsyncTask 中处理结果以将其下采样到 ImageView 中。

从相机应用程序返回时的活动流程会出现问题:由于某种原因,活动被创建,处理导致 AsyncTask 中的结果onActivityResult()被销毁,然后立即重新创建。一旦 AsyncTask 完成,它就会保存对不正确/旧活动的引用。

将一些调试语句放入各种生命周期回调中会发现这种奇怪的行为:

06-02 16:01:53.509: I/myapp(4437): onCreate com.myapp.PhotoActivity_@488cbef8
06-02 16:01:53.509: I/myapp(4437): onResume com.myapp.PhotoActivity_@488cbef8
06-02 16:01:58.298: I/myapp(4437): onPause com.myapp.PhotoActivity_@488cbef8
06-02 16:01:59.470: I/myapp(4437): onStop com.myapp.PhotoActivity_@488cbef8
[a photo is taken in the camera app]
06-02 16:02:10.196: I/myapp(4437): onCreate com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.251: I/myapp(4437): onActivityResult com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.259: I/myapp(4437): onResume com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.712: I/myapp(4437): onPause com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.720: I/myapp(4437): onStop com.myapp.PhotoActivity_@4874f8b8
06-02 16:02:10.923: I/myapp(4437): onCreate com.myapp.PhotoActivity_@48817118
06-02 16:02:10.931: I/myapp(4437): onResume com.myapp.PhotoActivity_@48817118
06-02 16:02:12.564: I/myapp(4437): onBitmapLoaded com.myapp.PhotoActivity_@4874f8b8
Run Code Online (Sandbox Code Playgroud)

被调用的活动实例onActivityResult()(请注意上面的哈希代码)不再与显示的最终实例匹配。当我的位图加载onBitmapLoaded()完成时,它也保存不正确的实例。

为什么会发生这种情况?如何防止(不必要地)重新创建该活动?

Mar*_*k R 4

显然应用程序的配置发生了变化在 onDestroy 中添加日志并改进 onCreate 中的日志以显示 Bundle savingInstanceState的值。如果savedInstanceState不为空,则配置更改将强制重新创建活动。在onSaveInstanceState(Bundle)中添加日志可能会有所帮助。

您可以通过在清单中设置 Activity 属性android:configChanges来处理自己的配置更改。

  • 就我而言(**免责声明:非常具体的情况**),我确实可以通过将 configChanges="orientation" 添加到清单中的活动条目来避免奇怪的娱乐行为。这本质上只是忽略了方向变化,这对我的活动来说不是问题,因为它也有“screenOrientation =“portrait””。 (4认同)
  • Android 的“好”不连贯性。我建议您使用 configChanges="orientation|screenSize" 因为在平板电脑上方向变化也会导致屏幕尺寸变化。 (4认同)
  • 因为只有当您在清单中为 android:configChanges 设置一些值时才会调用它!如果未设置,则默认行为是重新创建 Activity 并且不调用 onConfigurationChanged。就像我通过检查 onCreate 中的 savingInstanceState 值来编写改进日志一样,添加日志 onSaveInstanceState! (2认同)