【问题标题】:Samsung Galaxy Tab 7.0 restarts app on return from camera intent三星 Galaxy Tab 7.0 在从相机意图返回时重新启动应用程序
【发布时间】:2011-12-22 03:09:32
【问题描述】:

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

可能的线索:

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

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

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

【问题讨论】:

  • 我猜你必须手动处理活动中的方向变化,对于 xlarge 屏幕。或者为 xlarge 设备使用单独的 APK(带有 Manifiest 更改)。

标签: java android galaxy-tab


【解决方案1】:

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

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

【讨论】:

  • 根据这个Link,您可能还需要添加screenSize
  • 谢谢,这帮助很大。但这引发了另一个问题。请查看我的编辑
【解决方案2】:

我发现我的应用重新启动的原因是因为在启动相机应用时设备内存不足并且操作系统回收了我的主 Activity。这不会是一个问题,除非我有一个基于 Fragment 的布局,并且在 onCreate() 中完成了一些 Fragment 初始化,而不管 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多