3

我编写了我的第一个 Android 应用程序,并且对 Android 开发(以及 Java)非常陌生。我有 PreferenceActivity 并注意到当显示活动并关闭移动设备时,它的 onCreate() 再次被调用。更令人困惑的是静态成员MyFirstAppActivity.camera不再存在导致异常。我可以在那里检查 null 但我想知道为什么会发生这种情况以及避免它的最佳方法是什么?

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

     // Root
        addPreferencesFromResource(R.xml.preferences);

        // get list of available resolutions

        Object[] previewSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPreviewSizes().toArray();

        // split object properties into two arrays

        String[] ps=new String[previewSizes.length];

        for(int i=0;i<previewSizes.length;i++)
        {
            try
            {
                int width=((Size)previewSizes[i]).width;
                int height=((Size)previewSizes[i]).height;
                ps[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        // get list of available resolutions

        Object[] recordingSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPictureSizes().toArray();

        // split object properties into two arrays

        String[] rs=new String[recordingSizes.length];

        for(int i=0;i<recordingSizes.length;i++)
        {
            try
            {
                int width=((Size)recordingSizes[i]).width;
                int height=((Size)recordingSizes[i]).height;
                rs[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        Preference prefPreviewSizes = getPreferenceManager().findPreference("previewSizes");
        Preference prefRecordingSizes = getPreferenceManager().findPreference("recordingSizes");

        ((ListPreference) prefPreviewSizes).setEntries(ps);
        ((ListPreference) prefRecordingSizes).setEntries(rs);

    }
}
4

2 回答 2

1

您可能需要检查Android 的生命周期信息。

为了让事情变得更好,您应该实现onPauseand onResume,因为每次您更改 Activity 或旋转手机时都会调用它们。我认为关闭手机意味着将其锁定而不是关闭电源。在这种情况下,onCreate可能会调用它,因为您的手机正在清理 Activity 堆栈以节省电池。

在任何情况下,您都应该将所有事件侦听器添加到onCreate方法中,但是与显示的信息相关的任何内容都可以进入onResume(并且您应该在 期间保存任何信息或状态onPause)。这样,每当您的应用程序状态发生变化时,您的界面总是会显示新的数据。(默认情况下,EditText 和任何标准小部件存储其当前状态,但应仔细考虑与此不同的任何内容)。你可以把那个相机放在里面。

PS:我不确定这是否有帮助,但您可能希望将该camera变量放在另一个类中,可能是Singleton。在一个 Activity 中存储与多个 Activity 相关的信息在 Android 环境中可能看起来很奇怪。使用 Singleton,您可以确保您camera始终可以访问,无论您在哪里调用它(您仍然需要第一次初始化它)。您还可以扩展一个包含对相机的引用的基本活动,因此任何需要此变量的活动都可以直接访问它(但是,这会稍微增加应用程序的处理)。我重复一遍:这只是关于我如何面对这个变量的一些建议,它们不一定能帮助你解决问题。

于 2012-08-09T21:28:35.113 回答
0

每当发生某种状态更改(例如,关闭或旋转屏幕)时,onCreate都会调用该方法。

我很确定您应该做的是覆盖该 onSaveInstanceState方法并将数据保存到它的outStateBundle 中,然后将其onCreate作为savedInstanceStateBundle 传递给它。

有关更多信息,请查看 Android 开发者中心的“处理运行时更改”。

您可以通过在创建它之前检查它是否存在来防止您的相机引起异常,例如

if(MyFirstAppActivity.camera == null)
    MyFirstAppActivity.camera = new Camera(...);

或者只是创建它的一个新实例onCreate

于 2012-08-09T21:16:41.730 回答