1

我的代码在越来越小的设备(Motorola Xoom、Samsung Galaxy Player 4.0、Kyocera Digno)上按预期工作,但对于三星 Galaxy Tab 7.0,在启动ACTION_IMAGE_CAPTURE意图并拍照后,当应用程序返回时onDestroy()调用,然后是onCreate()then onActivityResult()被调用,finally 被调用,onDestroy()并且onCreate()被再次调用,这当然是不可取的 - 只onActivityResult()应该被调用。

可能的线索:

  • Galaxy Tab 7.0 的屏幕尺寸在清单文件中明确不支持(这是我测试过的唯一一个屏幕尺寸不受支持的设备),因此用户可以选择适合屏幕大小或缩放适合大小. 两个 UI 具有相同的(不良)行为。
  • 预览图片时,相机活动似乎会切换方向。我的应用程序仅支持纵向模式(编辑:在较小的屏幕上 - 在非 xlarge 屏幕上,它支持方向更改)。也许方向变化正在以某种方式破坏我的活动。
  • 我已经尝试从不同的意图(电子邮件意图)启动和返回,并且在这种情况下我的应用程序不会被破坏和重新创建。

如果需要更多信息或代码示例,请告诉我。

编辑:问题已缩小到方向变化。根据 Karthik 的回答,设置android:configChanges="orientation"解决了这个问题。唯一的问题是,我的应用程序支持 xlarge 屏幕上的方向更改。此设置会破坏这些设备上的此功能。我尝试android:configChanges="@string/config_changes"根据屏幕大小使用和提供不同的字符串,但现在我收到“安装错误:INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION”。据此,Android Activity,如何用 Java 代码覆盖清单的 android:configChanges?,无法以编程方式设置它。我唯一的选择是手动处理我的应用程序中的所有方向更改吗?

4

2 回答 2

3

你是对的,这是由于方向变化。相机在 Galaxy Tab 的横向模式下工作。
因此,您可以在清单文件中添加android:configChanges="orientation"标签<activity>

这将解决您的问题。onDestroy()并且onCreate()不会在从相机返回时被调用。

于 2011-12-22T04:15:41.100 回答
3

我发现我的应用程序重新启动的原因是因为在启动相机应用程序时设备内存不足并且操作系统回收了我的主要活动。这不会是一个问题,除非我有一个基于 Fragment 的布局并且一些 Fragment 初始化正在 中完成onCreate(),而不管 saveInstanceState 是什么。这导致自动 Fragment 恢复被丢弃,并使应用程序看起来像是从头开始重新启动,而实际上它只是在尝试恢复。

前任:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // add main menu -- WRONG!
    MainMenuFragment mainMenu = new MainMenuFragment();
    FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
    ft.add(R.id.contents, mainMenu);
    ft.commit();

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>
    }
}

为了解决这个问题,我在 savedInstanceState 不为 null 时跳过了 Fragment 初始化,并确保状态正确保存在onSaveInstanceState()并恢复到 中onCreate(),并对onActivityResult().

前任:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>

        // add main menu -- CORRECT!
        MainMenuFragment mainMenu = new MainMenuFragment();
        FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
        ft.add(R.id.contents, mainMenu);
        ft.commit();
    }
}
于 2012-04-17T23:55:37.273 回答